python - 具有高级混合索引的 Numpy 子数组分配

标签 python arrays numpy indexing

原始问题

当我尝试分配数组的某些元素时,收到一条非常奇怪的错误消息。我使用切片和一组索引的组合。请参阅以下简单示例。

 import scipy as sp

 a = sp.zeros((3, 4, 5))
 b = sp.ones((4, 5))

 I = sp.array([0, 1, 3])

 b[:, I] = a[0, :, I]

此代码引发以下ValueError:

ValueError:形状不匹配:形状(3,4)的值数组无法广播到形状(3,4)的索引结果

--

跟进

组合使用切片和序列时要小心。整数。正如 github 上指出的:

x = rand(3, 5, 7)

print(x[0, :, [0,1]].shape)
# (2, 5)

print(x[0][:, [0,1]].shape)
# (5, 2)

这就是 numpy 的设计工作原理,但 x[0][:, I] 与 x[0, :, I] 不同,这仍然有点令人困惑。因为这是我想要的行为,所以我选择在代码中使用 x[0][:, I]。

最佳答案

将您的代码复制到问题中时似乎存在一些错误。

但我怀疑索引存在一个已知问题:

In [73]: a=np.zeros((2,3,4)); b=np.ones((3,4)); I=np.array([0,1])

I 设为 2 个元素。索引 b 给出预期的 (3,2) 形状。切片中的 3 行,I 索引中的 2 列

In [74]: b[:,I].shape
Out[74]: (3, 2)

但是通过 3d a 我们得到了转置。

In [75]: a[0,:,I].shape
Out[75]: (2, 3)

并且赋值会产生错误

In [76]: b[:,I]=a[0,:,I]
...
ValueError: array is not broadcastable to correct shape

它首先放置由 I 定义的 2 个元素维度,然后放置 : 中的 3 个元素。这是前面讨论过的混合高级索引的情况 - 并且还存在错误问题。 (我得查一下)。

您可能正在使用较新的 numpy(或 scipy)并收到不同的错误消息。

据记录,使用两个数组或列表进行索引,并在中间进行切片,会将切片放在末尾,例如

In [86]: a[[[0],[0],[1],[1]],:,[0,1]].shape
Out[86]: (4, 2, 3)

同样的事情也发生在 a[0,:,[0,1]] 上。但有一个很好的论点表明事情不应该这样。

至于修复,您可以转置值,或更改索引

In [88]: b[:,I]=a[0:1,:,I]

In [90]: b[:,I]=a[0,:,I].T

In [91]: b
Out[91]: 
array([[ 0.,  0.,  1.,  1.],
       [ 0.,  0.,  1.,  1.],
       [ 0.,  0.,  1.,  1.]])

In [92]: b[:,I]=a[0][:,I]

https://github.com/numpy/numpy/issues/7030

https://github.com/numpy/numpy/pull/6256

关于python - 具有高级混合索引的 Numpy 子数组分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36207850/

相关文章:

python - 队列形状必须与数据类型具有相同的长度

python - 水平连接numpy向量和矩阵

python - 如何获取 FEN 位置的字符串

ios - 选择 UITableView 中的所有行,并在数组中附加标签

ruby-on-rails - 在每个数组元素中输出不带类名的 JSON 数组

php - "Notice: Undefined variable"、 "Notice: Undefined index"、 "Warning: Undefined array key"和 "Notice: Undefined offset"使用 PHP

python - 谷歌应用引擎Python : Class Not Defined

python - 使用 python 生成具有限制和一定长度的给定数字的随机列表

php - 表格单元格/二维数组排序算法

python - 如何从结构化 numpy 数组中删除列*而不复制它*?