我的问题可能看起来太简单了,但我很想知道为什么Python中可以使用它。你知道吗
假设我们定义了一个大小为(4,3)的数组:
import numpy as np
a=np.random.randint(15,size=(4,3))
结果如下:
array([[ 7, 6, 1],
[ 5, 3, 6],
[12, 10, 11],
[ 1, 3, 4]])
两者之间的区别是什么:
a[0]
Result:
array([7, 6, 1])
以及
a[0:1]
Result:
array([[7, 6, 1]])
因为它们都返回矩阵的相同部分:
7, 6, 1
我知道区别在于前者的形状是(3,),而后者的大小是(1,3)。 但我的问题是为什么我们需要这些形状。如果您熟悉Matlab,那么使用冒号给出一个范围将得到两行,但在Python中,它返回的信息相同,形状不同。有什么意义?有什么好处?你知道吗
原因是您可以确信array[x:y]总是返回原始数组的子数组。这样就可以使用它上面的所有数组方法。说你有
即使
y-x == 1
或y-x == 0
,也可以保证有一个从array[x:y]
返回的数组,并且可以对其进行映射。想象一下,如果array[1:2]
返回单个项,即array[1]
。那么上面代码的行为取决于数组[1]是什么,它可能不是您想要的。你知道吗array[m:n]
返回一个数组,array[0]
返回数组的一个元素(我保证,这也会影响NumPy的内容,请继续阅读):这就是为什么会得到这些结果:
如果仔细看,第二个返回一个
array
来包装一个数字列表,而第一个返回一个array
来包装一个数字列表。你知道吗当你对一个强的索引集的开始点感到困惑时,我认为它是一个强的索引集。我相信在Matlab中,开始索引和结束索引都是包含的。你知道吗
你举的例子是:
a[0:1]
将采用索引0,而不是1。你知道吗但是,如果您使用
a[0:2]
,您将得到索引0和1处的值,并得到您似乎期望的结果。你知道吗这也解释了为什么形状是不同的,[0:1]正是你所期望的。它提供了一个行列表,但是该列表只包含一行,因此
1
的形状是(1, 3)
。 相反,[0]只提供一行,而不是行列表。该行有3个元素,因此得到了形状(3,)
相关问题 更多 >
编程相关推荐