未知维度的 Numpy 索引数组?
Numpy index array of unknown dimensions?
我需要比较一堆不同维度的 numpy 数组,比如说:
a = np.array([1,2,3])
b = np.array([1,2,3],[4,5,6])
assert(a == b[0])
如果我不知道 a 和 b 的形状,我该怎么办
len(shape(a)) == len(shape(b)) - 1
而且我也不知道从 b 跳过哪个维度。我想使用 np.index_exp,但这似乎对我没有帮助......
def compare_arrays(a,b,skip_row):
u = np.index_exp[ ... ]
assert(a[:] == b[u])
编辑
或者换句话说,如果我知道数组的形状和我想错过的维度,我就不会构造切片。我如何动态创建 np.index_exp,如果我知道维度和位置的数量,在哪里放置“:”以及在哪里放置“0”。
我只是在查看 apply_along_axis
和 apply_over_axis
的代码,研究它们如何构建索引对象。
让我们制作一个 4 维数组:
In [355]: b=np.ones((2,3,4,3),int)
列出 slices
(使用列表 * 复制)
In [356]: ind=[slice(None)]*b.ndim
In [357]: b[ind].shape # same as b[:,:,:,:]
Out[357]: (2, 3, 4, 3)
In [358]: ind[2]=2 # replace one slice with index
In [359]: b[ind].shape # a slice, indexing on the third dim
Out[359]: (2, 3, 3)
或者用你的例子
In [361]: b = np.array([1,2,3],[4,5,6]) # missing []
...
TypeError: data type not understood
In [362]: b = np.array([[1,2,3],[4,5,6]])
In [366]: ind=[slice(None)]*b.ndim
In [367]: ind[0]=0
In [368]: a==b[ind]
Out[368]: array([ True, True, True], dtype=bool)
这个索引与np.take
基本相同,但同样的想法可以扩展到其他情况。
我不太理解你关于使用 :
的问题。请注意,在构建索引列表时,我使用 slice(None)
。解释器将所有索引 :
翻译成 slice
对象:[start:stop:step] => slice(start, stop, step)
.
通常不需要使用a[:]==b[0]
; a==b[0]
就足够了。对于列表 alist[:]
进行复制,对于数组它什么也不做(除非在 RHS 上使用,a[:]=...
)。
我需要比较一堆不同维度的 numpy 数组,比如说:
a = np.array([1,2,3])
b = np.array([1,2,3],[4,5,6])
assert(a == b[0])
如果我不知道 a 和 b 的形状,我该怎么办
len(shape(a)) == len(shape(b)) - 1
而且我也不知道从 b 跳过哪个维度。我想使用 np.index_exp,但这似乎对我没有帮助......
def compare_arrays(a,b,skip_row):
u = np.index_exp[ ... ]
assert(a[:] == b[u])
编辑 或者换句话说,如果我知道数组的形状和我想错过的维度,我就不会构造切片。我如何动态创建 np.index_exp,如果我知道维度和位置的数量,在哪里放置“:”以及在哪里放置“0”。
我只是在查看 apply_along_axis
和 apply_over_axis
的代码,研究它们如何构建索引对象。
让我们制作一个 4 维数组:
In [355]: b=np.ones((2,3,4,3),int)
列出 slices
(使用列表 * 复制)
In [356]: ind=[slice(None)]*b.ndim
In [357]: b[ind].shape # same as b[:,:,:,:]
Out[357]: (2, 3, 4, 3)
In [358]: ind[2]=2 # replace one slice with index
In [359]: b[ind].shape # a slice, indexing on the third dim
Out[359]: (2, 3, 3)
或者用你的例子
In [361]: b = np.array([1,2,3],[4,5,6]) # missing []
...
TypeError: data type not understood
In [362]: b = np.array([[1,2,3],[4,5,6]])
In [366]: ind=[slice(None)]*b.ndim
In [367]: ind[0]=0
In [368]: a==b[ind]
Out[368]: array([ True, True, True], dtype=bool)
这个索引与np.take
基本相同,但同样的想法可以扩展到其他情况。
我不太理解你关于使用 :
的问题。请注意,在构建索引列表时,我使用 slice(None)
。解释器将所有索引 :
翻译成 slice
对象:[start:stop:step] => slice(start, stop, step)
.
通常不需要使用a[:]==b[0]
; a==b[0]
就足够了。对于列表 alist[:]
进行复制,对于数组它什么也不做(除非在 RHS 上使用,a[:]=...
)。