【问题标题】:Numpy index array of unknown dimensions?未知维度的numpy索引数组?
【发布时间】:2016-07-05 14:56:22
【问题描述】:

我需要比较一堆不同维度的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])

编辑 或者换句话说,如果我知道数组的形状和我想错过的维度,我就不会构造切片。如果我知道维度和位置的数量、放置“:”的位置以及放置“0”的位置,如何动态创建 np.index_exp。

【问题讨论】:

  • 是 np.take 你在找什么?
  • 谢谢,np.take 似乎在给定的轴上工作。我可能可以使用它,但是我如何给“:”来定义范围?
  • skip row 或行是什么意思?或者你的意思是跳过一个维度?
  • @hpaulj 谢谢,我的意思是尺寸,已更正。

标签: numpy multidimensional-array assertion


【解决方案1】:

我只是在查看apply_along_axisapply_over_axis 的代码,研究它们如何构造索引对象。

让我们创建一个 4d 数组:

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[:]=...)。

【讨论】:

  • 非常感谢。看起来我不知道“slice()”构造,有了这个我确实可以构造任何类型和任何维度的索引,完美!
猜你喜欢
  • 1970-01-01
  • 2020-06-09
  • 2023-03-15
  • 1970-01-01
  • 2019-11-20
  • 1970-01-01
  • 1970-01-01
  • 2012-04-26
  • 1970-01-01
相关资源
最近更新 更多