当前位置: 首页 > 面试题库 >

带有高级混合索引的Numpy子数组分配

阎星华
2023-03-14
问题内容

原始问题

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

 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)的索引结果

-

跟进

将slice和seq组合使用时要小心。整数 正如在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])

制作I2个元素。标引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

它将2元素的尺寸由I第一个定义,将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



 类似资料:
  • 主要内容:1. 整数数组索引,2. 布尔数组索引,3. 花式索引(拓展知识)NumPy 与 Python 的内置序列相比,它提供了更多的索引方式。除了在《 Numpy切片和索引》一节用到索引方式外,在 NumPy 中还可以使用高级索引方式,比如整数数组索引、布尔索引以及花式索引,本节主要对上述三种索引方式做详细介绍。 高级索引返回的是数组的副本(深拷贝),而切片操作返回的是数组视图(浅拷贝)。如果您对副本和视图的概念陌生,可直接跳转学习《 NumPy副本和视图》一节。 1

  • Numpy 比一般的 Python 序列提供更多的索引方式。除了前面章节介绍的用整数和切片的索引外,本节深入介绍布尔型索引和花式索引。 1. 布尔型索引 在前面的章节,我们简单介绍了,可以通过一个布尔数组来索引目标数组。 1.1 比较运算符与布尔型数组 在实际使用中,可以通过比较运算符来产生一个布尔型数组。 案例 利用random模块产生一个大小为7×4的随机数数组: data = np.rand

  • 问题内容: 我要寻找一个量化的方式来索引的索引。 例如: 我想建立一个新的数组,以便该数组中的每一行(i)都是array的row(i),并由数组inds(i)的行索引。我想要的输出是: 我可以通过循环来实现: 但我正在寻找一种纯矢量化的解决方案。 问题答案: 使用索引数组对另一个数组进行索引时,每个索引数组的形状应与 输出 数组的形状匹配。您希望列索引匹配,并且您希望行索引匹配输出的行,例如: 由

  • 有两种类型的高级索引:整数和布尔值。 这种机制有助于基于 N 维索引来获取数组中任意元素。 每个整数数组表示该维度的下标值。 当索引的元素个数就是目标的维度时,会变得相当直接。 以下示例获取了ndarray对象中每一行指定列的一个元素。 因此,行索引包含所有行号,列索引指定要选择的元素。 输出如下: [1 4 5] 该结果包括数组中(0,0),(1,1)和(2,0)位置处的元素。 示例 2 i

  • 问题内容: 我正在尝试创建具有混合数据类型(字符串,整数,整数)的NumPy数组/矩阵(Nx3)。但是,当我通过添加一些数据来添加此矩阵时,出现错误: TypeError:无效的类型提升 。拜托,有人可以帮我解决这个问题吗? 当我用示例数据创建一个数组时,NumPy将矩阵中的所有列都转换为一种“ S”数据类型。而且我无法为数组指定数据类型,因为当我执行此操作时, res = np.array([“

  • 问题内容: 我有一个像这样的numpy数组: 并想创建一个数组,其中索引0中的值在索引1中,索引1在索引2中,依此类推。 我想要的输出是: 我猜想有一个简单的方法可以做到这一点,而无需遍历整个数组。我如何以numPythonic的方式做到这一点? 问题答案: 您可以使用 要么