मैं एक बड़े (1,000,000 x 3,000) बूलियन numpy सरणी में एक अनुक्रमित वजन राशि की गणना करना चाहता हूँ। बड़ी बुलियन सरणी को बार-बार बदलती है, लेकिन वजन क्वेरी समय पर आते हैं, और मुझे बड़ी बड़ी सरणी की प्रतिलिपि के बिना, छोटे वज़न सरणी को बड़े सरणी के आकार में विस्तारित करने के बिना उत्तर की आवश्यकता है।कुशलता से एक छोटी संख्यात्मक सरणी समृद्ध, एक विशाल संख्यात्मक सरणी में प्रसारित?
परिणाम 1,000,000 प्रविष्टियों के साथ एक सरणी होना चाहिए, प्रत्येक में उस पंक्ति के True मानों के अनुरूप वजन वाली सरणी प्रविष्टियों का योग होना चाहिए।
मैंने मास्क किए गए सरणी का उपयोग करने में देखा, लेकिन उन्हें वजन की सरणी मेरे बड़े बुलियन सरणी के आकार की आवश्यकता होती है।
नीचे दिया गया कोड सही परिणाम देता है, लेकिन मैं गुणात्मक चरण के दौरान की प्रतिलिपि नहीं ले सकता। गुणा भी आवश्यक नहीं है, क्योंकि मान सरणी बुलियन है, लेकिन कम से कम यह प्रसारण को ठीक से संभालती है।
मैं numpy के लिए नया हूँ, और इसे प्यार करता हूँ, लेकिन मैं इस विशेष समस्या के लिए इसे छोड़ने वाला हूं। मैंने पाइथन में लूप्स से कुछ भी रहने के लिए पर्याप्त संख्या में सीखा है।
मेरे अगले कदम सी में इस दिनचर्या लिखने के लिए किया जाएगा (जो है, मुझे बाइट्स की बजाय बिट्स का उपयोग करके स्मृति को बचाने दे द्वारा रास्ते से जोड़ा लाभ।)
आप numpy गुरुओं में से एक जब तक मुझे साइथन से बचा सकता है?
from numpy import array, multiply, sum
# Construct an example values array, alternating True and False.
# This represents four records of three attributes each:
# array([[False, True, False],
# [ True, False, True],
# [False, True, False],
# [ True, False, True]], dtype=bool)
values = array([(x % 2) for x in range(12)], dtype=bool).reshape((4,3))
# Construct example weights, one for each attribute:
# array([1, 2, 3])
weights = array(range(1, 4))
# Create expensive NEW array with the weights for the True attributes.
# Broadcast the weights array into the values array.
# array([[0, 2, 0],
# [1, 0, 3],
# [0, 2, 0],
# [1, 0, 3]])
weighted = multiply(values, weights)
# Add up the weights:
# array([2, 4, 2, 4])
answers = sum(weighted, axis=1)
print answers
# Rejected masked_array solution is too expensive (and oddly inverts
# the results):
masked = numpy.ma.array([[1,2,3]] * 4, mask=values)
आपको जो चाहिए वह उदाहरण के साथ बढ़िया काम। – steveha