索引一维数组时,“无”是什么意思,为什么形状会发生变化?

时间:2019-02-20 06:41:46

标签: python numpy

a = np.array([1, 2, 3])
a.shape
(3,)# why not(1,3)?
v1 = np.array([4, 5, 6])[None,:] # what does none over here mean?
v1.shape
(1,3) #why (1,3) here?

为什么形状对一维数组显示不同的答案,这里没有什么意思?

2 个答案:

答案 0 :(得分:0)

此处的切片是通过np.newaxis对象完成的。 它可以采用默认值None

np.array([1, 2, 3])基本上包含3列和1行。 通常,具有单个值的元组最后以','结尾。

np.array([4, 5, 6])[None,:]使用np.newaxis对象,该对象可以设置为“无”。 依次显示每一行中的每个元素。

对newaxis对象的引用:numpy.newaxis

newaxis对象可用于所有切片操作中,以创建长度为一的轴。 newaxis是“无”的别名,可以用“无”代替它,结果相同。

答案 1 :(得分:0)

在某些编程语言或框架中,一维数组被认为与其中一个维的长度为1的二维数组相同。

但不是numpy

在numpy中,一维数组是这样的:

  1. (n,)打印为形状(其中n是其唯一尺寸的长度)
  2. 那些元素只需要一个索引即可单独访问。

一个numpy的二维数组是什么:

  1. (m,n)打印为形状
  2. 其元素需要两个索引才能单独访问。

numpy ndarray的shape属性告诉您数组每个维度的长度。

a = np.array([1, 2, 3])中,您将创建一个一维数组,而该维的唯一长度为3。

要创建“最近的”二维数组,您必须调用np.array([[1, 2, 3]])

在开头注意连续的[[,在结尾注意连续的]]。当您打印此二维数组时,这些双括号也会出现。

通常(以可视方式计算出ndarray中维数的数量)在开始(或末尾)处的连续括号的数量。

将None用作numpy中的索引

通常,在Python中,当您对列表进行切片或将其索引到列表中时,您可能习惯于获得相同数量维或更少的结果。 strong>尺寸数。

但是在numpy中,有时可以使用索引符号来构建更高维的ndarray。

当您获取np.array([4, 5, 6])的结果并用[None, :]对其进行索引时,这就是您在这里所做的事情。

在numpy中,将None指定为索引时,它与指定numpy.newaxis相同。 (它只是numpy.newaxis的更紧凑的替代方案)

然后,在特定位置(在您的情况下,索引中的位置0)将numpy.newaxis指定为索引,就像在说:“我想再增加一个维度,长度为1 ,在这个特定位置”

(请注意,在numpy中,单词 axis dimension 在文档中可互换使用。)

在您的情况下,np.array([4, 5, 6])首先返回一个一维数组,该唯一维的长度为3(因为有3个元素)。

当您随后使用[None, :]索引到此一维数组时,您的第一个索引None实际上是在说您要在位置0处添加长度为1的新维度的前缀(即索引中的位置0)。换句话说,您要首先创建一个长度为1的外部数组,而该外部数组的唯一元素将是一个内部数组,并且该内部数组的形状和内容由索引进一步指定,跟随您的None(在这种情况下,只需跟踪:)。

(由于此新前缀维的长度始终为1,因此可用于该新维的唯一有效索引将为0)

当您在此新前缀维度上使用索引0时,第二个索引(:)实际上是指定要获取的内容。通过将:指定为第二个索引,实际上是在说您希望np.array([4, 5, 6])的整个结果都出现在新前缀维的位置0。