समस्या x[1,x[0,:]+1]
में है, दूसरी अक्ष के लिए सूचकांक: x[0,:]+1
[1 2 3 4 5 6 7 8 9 10]
है, जिसमें सूचकांक 10
x के आयाम से बड़ा है।
x[1,x[0,:]-1]
के मामले में, 2 अक्ष के सूचकांक [-1 0 1 2 3 4 5 6 7 8 9]
है, तो आप [9 0 1 2 3 4 5 6 7 8]
हो रही अंत, के रूप में 9
पिछले तत्व है और -1
का एक सूचकांक है। अंत से दूसरे तत्व की अनुक्रमणिका -2 है और इसी तरह।
np.where((x[0,:]<5)&(x[0,:]>0),x[1,x[0,:]-1],x[1,:])
और
x[0,:]=[0 1 2 3 4 5 6 7 8 9]
साथ
, क्या अनिवार्य रूप से चल रहा है कि पहले सेल प्रपत्र x[1,:]
लिया जाता है क्योंकि x[0,0]
0 और x[0,:]<5)&(x[0,:]>0
False
है। अगले चार तत्व x[1,x[0,:]-1]
से लिया गया है। शेष x[1,:]
से हैं। अंत में परिणाम है [0 0 1 2 3 4 5 6 7 8]
यह सिर्फ 1 सेल की रपट खिड़की के लिए ठीक प्रतीत हो सकता है, लेकिन इसके साथ आश्चर्य करने वाले तुम हो:
>>> np.where((x[0,:]<5)&(x[0,:]>0),x[1,x[0,:]-2],x[1,:])
array([0, 9, 0, 1, 2, 5, 6, 7, 8, 9])
आप दो कोशिकाओं के एक खिड़कियों से इसे स्थानांतरित करने का प्रयास करते हैं ।
इस विशिष्ट समस्या के लिए, यदि हम एक पंक्ति में हर चीज रखना चाहते हैं, इस, क्या करेंगे:
>>> for i in [1, 2, 3, 4, 5, 6]:
print hstack((np.where(x[1,x[0,:]-i]<x[0, -i], x[1,x[0,:]-i], 0)[:5], x[0,5:]))
[0 0 1 2 3 5 6 7 8 9]
[0 0 0 1 2 5 6 7 8 9]
[0 0 0 0 1 5 6 7 8 9]
[0 0 0 0 0 5 6 7 8 9]
[0 0 0 0 0 5 6 7 8 9]
[0 0 0 0 0 5 6 7 8 9]
संपादित करें: अब मैं अपने मूल प्रश्न को बेहतर समझते हैं, मूल रूप से आप एक 2D ले जाना चाहते हैं सरणी और प्रत्येक सेल के चारों ओर एन * एन सेल औसत की गणना करें। यह काफी आम है। सबसे पहले आप संभवतः एन को विषम संख्याओं तक सीमित करना चाहते हैं, अन्यथा सेल के चारों ओर 2 * 2 औसत जैसी चीज को परिभाषित करना मुश्किल है। मान लीजिए हम चाहते हैं 3 * 3 औसत:
#In this example, the shape is (10,10)
>>> a1=\
array([[3, 7, 0, 9, 0, 8, 1, 4, 3, 3],
[5, 6, 5, 2, 9, 2, 3, 5, 2, 9],
[0, 9, 8, 5, 3, 1, 8, 1, 9, 4],
[7, 4, 0, 0, 9, 3, 3, 3, 5, 4],
[3, 1, 2, 4, 8, 8, 2, 1, 9, 6],
[0, 0, 3, 9, 3, 0, 9, 1, 3, 3],
[1, 2, 7, 4, 6, 6, 2, 6, 2, 1],
[3, 9, 8, 5, 0, 3, 1, 4, 0, 5],
[0, 3, 1, 4, 9, 9, 7, 5, 4, 5],
[4, 3, 8, 7, 8, 6, 8, 1, 1, 8]])
#move your original array 'a1' around, use range(-2,2) for 5*5 average and so on
>>> movea1=[a1[np.clip(np.arange(10)+i, 0, 9)][:,np.clip(np.arange(10)+j, 0, 9)] for i, j in itertools.product(*[range(-1,2),]*2)]
#then just take the average
>>> averagea1=np.mean(np.array(movea1), axis=0)
#trim the result array, because the cells among the edges do not have 3*3 average
>>> averagea1[1:10-1, 1:10-1]
array([[ 4.77777778, 5.66666667, 4.55555556, 4.33333333, 3.88888889,
3.66666667, 4. , 4.44444444],
[ 4.88888889, 4.33333333, 4.55555556, 3.77777778, 4.55555556,
3.22222222, 4.33333333, 4.66666667],
[ 3.77777778, 3.66666667, 4.33333333, 4.55555556, 5. ,
3.33333333, 4.55555556, 4.66666667],
[ 2.22222222, 2.55555556, 4.22222222, 4.88888889, 5. ,
3.33333333, 4. , 3.88888889],
[ 2.11111111, 3.55555556, 5.11111111, 5.33333333, 4.88888889,
3.88888889, 3.88888889, 3.55555556],
[ 3.66666667, 5.22222222, 5. , 4. , 3.33333333,
3.55555556, 3.11111111, 2.77777778],
[ 3.77777778, 4.77777778, 4.88888889, 5.11111111, 4.77777778,
4.77777778, 3.44444444, 3.55555556],
[ 4.33333333, 5.33333333, 5.55555556, 5.66666667, 5.66666667,
4.88888889, 3.44444444, 3.66666667]])
मुझे लगता है कि आप आप 2 डी सरणी, कि भ्रम का कारण बनता समतल की जरूरत नहीं है। साथ ही, यदि आप किनारे के तत्वों को अलग-अलग ट्रिम करने के अलावा अलग-अलग हिस्सों को संभालना चाहते हैं, तो 'अपने मूल सरणी को चारों ओर ले जाएं' में np.ma
का उपयोग करके मास्क किए गए सरणी बनाने पर विचार करें।
स्पष्टीकरण के लिए आप 'vector2 [i] 'मतलब में शामिल नहीं करना चाहते हैं या यह कोड में एक गलती थी? – Daniel
मैं नहीं करता हूं। धन्यवाद। – JEquihua
आपका कोड प्रत्येक सेल के 3x3 पड़ोस के औसत की गणना करता है, न कि 6x6 पड़ोस; क्या यह जानबूझकर था? – nneonneo