当以某种出乎意料的方式执行特定切片时,numpy数组的形状正在改变
我尝试了将同一阵列切成薄片的几种方法,但是细微的差异会导致阵列形状的结果不同
import numpy as np
z = np.zeros((1,9,10,2))
# This makes sense
print(z[...,[1,0]].shape)
# (1, 9, 10, 2)
print(z[0,...].shape)
# (9, 10, 2)
print(z[0:1,...,[1,0]].shape)
# (1, 9, 10, 2)
print(z[0][...,[1,0]].shape)
# (9, 10, 2)
# This doesn't, I would expect (9, 10, 2) in both cases
print(z[0,:,:,[1,0]].shape)
# (2, 9, 10)
print(z[0,...,[1,0]].shape)
# (2, 9, 10)
在最后两个示例中,我不明白为什么最后一个轴移动到第一个位置。
我使用Python 3.6.4
与numpy 1.15.1
在最后两种情况下可能会发现结果出乎意料的原因是,即使您也使用切片进行索引,但数组的索引仍遵循高级索引的规则。
有关此行为的详细说明,您可以检查结合使用高级索引编制和基本索引编制。在这些最后的情况下,您将得到意想不到的结果形状。在文档中,您将看到上述情况之一,其中我们可能会获得意外的结果:
x[arr1, :, arr2]
。在您的情况下,尽管您仅使用整数沿第一个轴进行索引,但是它会广播,并且两个数组都将被迭代为一个。在这种情况下,由高级索引操作产生的尺寸首先位于结果数组中,然后是切片的尺寸。
关键是要了解文档中提到的内容, 就像将每个高级index元素的索引结果串联起来一样 。
因此,从本质上讲,它的作用与以下操作相同:
z = np.random.random((1,9,10,2))
a = np.concatenate([z[0,:,:,[1]], z[0,:,:,[0]]], axis=0)
与上次索引操作相同:
b = z[0,:,:,[1,0]]
np.allclose(a,b)
# True
这种行为背后的原因是什么?
要记住的一般规则是:
数组索引引入的结果轴位于最前面,除非它们是连续的。
因此,由于此处的索引数组不是连续的,因此使用它们的结果轴将位于前面,而切片的尺寸将位于后面。
尽管使用一维数组建立索引似乎很奇怪,但是要考虑到也可以使用任意数量的维进行索引。假设我们在第一个和最后一个轴上使用3d数组索引相同的示例数组,两个数组都表示形状为(3,4,2)。因此,我们知道最终数组在某处也将具有形状(3,4,2),因为两个索引数组都广播为相同形状。现在的问题是,应将索引数组之间的完整切片放在哪里?
考虑到不再应该将其放在中间,在这些情况下有一个约定,即切成薄片的尺寸排在最后。因此,在这种情况下,重新排列数组的尺寸以匹配我们的预期输出将是我们的任务。在上面的示例中,我们可以做的是交换最后两个轴,并使用swapaxes
获得的结果按预期的方式获得尺寸。
问题内容: 假设我有一个一维numpy数组 我想将此编码为2D一热阵列 有快速的方法吗?比循环遍历设置元素更快。 问题答案: 您的数组定义了输出数组中非零元素的列。您还需要定义行,然后使用花式索引:
假设我有一个1d numpy数组 我想将其编码为一个2D one hot数组 有没有快速的方法可以做到这一点?比仅仅在上循环设置的元素更快。
问题内容: 我对python和numpy很陌生。请问有人可以帮助我了解如何对用作索引的某些数组进行索引。我有以下六个2D阵列- 我想将这些数组用作索引,并将值10放入新的空矩阵的相应索引中。输出应如下所示: 到目前为止,我已经尝试过 但这给了我错误的输出。任何帮助请。 问题答案: 工作原理: 如果您在工作分配中使用 两个 numpy数组建立索引, 然后认为NumPy的作为过的各元件同时移动和中的每
问题内容: 在Python中,我们可以使用来获取数组中值的索引。 但是,当我尝试执行NumPy数组时: 我得到: AttributeError:“ numpy.ndarray”对象没有属性“ index” 我如何在NumPy数组上执行此操作? 问题答案: 使用来获得,其中一个给定的条件是指数。 例子: 对于称为的2D : 对于一维数组: 请注意,这也适用于像条件,,等等… 您也可以使用方法创建的子
问题内容: 我要寻找一个量化的方式来索引的索引。 例如: 我想建立一个新的数组,以便该数组中的每一行(i)都是array的row(i),并由数组inds(i)的行索引。我想要的输出是: 我可以通过循环来实现: 但我正在寻找一种纯矢量化的解决方案。 问题答案: 使用索引数组对另一个数组进行索引时,每个索引数组的形状应与 输出 数组的形状匹配。您希望列索引匹配,并且您希望行索引匹配输出的行,例如: 由
问题内容: 我正在使用NumPy在Python中使用标准方法创建对称矩阵/数组: 现在让我们变得聪明: 等一下 左上和右下部分是对称的。如果我选择了较小的阵列怎么办? 好.... 只是要确保… 这是一个错误,还是我要学习一些有关NumPy数组的疯狂知识? 问题答案: 该操作返回该数组的 视图 ,这意味着未分配新数组。反过来,这意味着您正在同时读取和修改阵列。很难说出为什么某些大小或结果区域起作用的