(在這篇文章中,讓np
被簡寫numpy
)numpy.ndarray枚舉的維度的適當子集?
假設a
爲(Ñ + ķ)‑尺寸np.ndarray
對象,對於某些整數Ñ > 1和ķ > 1.(IOW,ñ + k > 3是a.ndim
的值)。我想枚舉a
的第一個n尺寸;這意味着,在每一次迭代,枚舉/迭代器產生一對,其第一元素是Ñ索引的元組ii
,和第二個元素是ķ‑維子ndarray
在a[ii]
。
誠然,這是不難編寫一個函數來做到這一點(其實,我在下面提供這樣的功能的例子),但我想知道這一點:
並
numpy
提供任何特殊用於執行這種「部分」枚舉的語法或函數?
(通常情況下,當我想遍歷一個多維np.ndarray
對象,我用np.ndenumerate
,但它不會在這裏幫助,因爲(據我可以告訴)np.ndenumerate
會遍歷所有ñ + ķ尺寸)
假設回答上面的問題是肯定的,再有就是這個後續:
那麼迭代的n尺寸是不是連續的情況呢?
(在這種情況下,一對的第一個元素返回在由枚舉/迭代每次迭代將- [R > Ñ元件的元組其中的一些將是一個特殊值表示「所有」,例如slice(None)
;這對第二元件仍然會長度ķ的ndarray
)
謝謝!
下面的代碼有望澄清問題規範。功能partial_enumerate
做我想做的事情,使用任何特殊的numpy
結構可用於此目的。以下的partial_enumerate
定義爲的情況下Ñ = ķ = 2.
import numpy as np
import itertools as it
def partial_enumerate(nda, n):
"""Enumerate over the first N dimensions of the numpy.ndarray NDA.
Returns an iterator of pairs. The first element of each pair is a tuple
of N integers, corresponding to a partial index I into NDA; the second element
is the subarray of NDA at I.
"""
# ERROR CHECKING & HANDLING OMITTED
for ii in it.product(*[range(d) for d in nda.shape[:n]]):
yield ii, nda[ii]
a = np.zeros((2, 3, 4, 5))
for ii, vv in partial_enumerate(a, 2):
print ii, vv.shape
輸出的每一行是一個「雙元組」,其中所述第一元組一個簡單的例子代表的部分集合座標a
,第二個代表a
在這些部分座標處的維形子陣列的形狀; (該第二對的值對於所有的行是相同的,從所述陣列的規律性預期):
(0, 0) (4, 5)
(0, 1) (4, 5)
(0, 2) (4, 5)
(1, 0) (4, 5)
(1, 1) (4, 5)
(1, 2) (4, 5)
相反,遍歷np.ndenumerate(a)
在這種情況下將導致a.size
迭代中,每個來訪的個體細胞的a
。
「如何迭代維度不連續?我不確定這是可能的純粹的numpy陣列。與標準python列表不同,整個數組存儲在連續的內存塊中。作爲一個例子,你的意思是一個2D數組,其結果是'[row.shape for a row in a]'='[1,2,1,3,...]'? – Hooked 2012-03-05 16:29:04
「在這種情況下,由枚舉器/迭代器在每次迭代中返回的對的第一個元素將是r> n個元素的元組,其中一些元素是表示」all「的特殊值,例如slice(None);這一對的第二個元素仍然是長度爲k的ndarray。「這對我來說沒有意義,因爲它會產生不一致的習慣用法。它不是由單一項目索引組成,而是由單個項目索引和索引序列組成。因此它將不再是指數和子陣列之間的雙射。一個索引可以引用許多子數組。 – senderle 2012-03-07 17:38:03
我相信這會導致長度爲k + j的圖表,其中j是索引元組中的序列數目(即非單項索引)。 – senderle 2012-03-07 17:38:41