我的问题可能看起来太简单了,但是我很好奇为什么要在Python中使用它。
假设我们定义了一个大小为(4,3)的数组:
char* c = new char; // Not specifying size here
c[0] = 'h';
c[1] = 'i';
c[2] = '\0';
delete c;
char* d = new char[3];
d[0] = 'h';
d[1] = 'i';
d[2] = '\0';
delete[] d;
结果将如下所示:
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]])
我确实知道区别在于形状,因为前者的形状为(3,),而后者的尺寸为(1,3)。 但是我的问题是,为什么我们需要具有这种形状。如果您熟悉Matlab,则使用冒号指定范围会给您两行,但是在Python中,它会以相同的形状返回相同的信息。有什么意义?有什么好处?
答案 0 :(得分:2)
原因是您可以确信array [x:y]总是返回原始数组的子数组。这样就可以使用所有的数组方法。说你有
map(lambda1, array[x:y])
即使y-x == 1
或y-x == 0
,也可以保证从array[x:y]
返回一个数组,并且可以对其进行映射。想象一下,如果array[1:2]
返回了单个项目,即array[1]
。然后,上面代码的行为取决于array [1]是什么,并且可能不是您想要的。
答案 1 :(得分:0)
我相信您会感到困惑的是,在python中,当您对数组进行拼接时,它包含开始索引,但结束索引是排他的。我相信在Matlab中,开始索引和结束索引都包含在内。
因此对于您给出的示例:
a[0:1]
将采用索引0,而不是1。
但是,如果您使用的是a[0:2]
,则将获得索引0和1的值,并获得您似乎期望的结果。
这也解释了形状为何不同的原因,a [0:1]完全按照您的期望进行。它为您提供了一个行列表,但该列表仅包含1行,因此1
的形状为(1, 3)
。
相反,a [0]仅给您单行,而不是行列表。该行包含3个元素,因此您得到的形状为(3,)
答案 2 :(得分:0)
array[m:n]
返回一个数组,array[0]
返回该数组的元素(我保证,这也与NumPy内容有关,请继续阅读):
> py -3
Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> array = [1,2,3]
>>> array[0]
1
>>> array[0:1]
[1]
>>>
这就是为什么您得到这些结果的原因:
a[0]
结果:
array([7, 6, 1])
和
a[0:1]
结果:
array([[7, 6, 1]])
如果仔细看,第二个返回一个array
,它包装一个 列表的列表,而第一个返回一个array
,它包装一个列表数字。
答案 3 :(得分:0)
我将尝试用一个简化的例子来解释。
simple_matrix = [[0,1,2],[3,4,5],[6,7,8]]
以下代码正在从列表列表中打印单个元素:
print (simple_matrix[0])
打印的元素是一个列表,这是因为simple_matrix的索引0处的元素是仅一个列表:
>>> [0,1,2]
使用切片,如下面的示例所示,不是返回单个元素,而是两个。 在这种情况下,将元素列表期望为返回值更为简单,而这正是我们看到的结果:
print (simple_matrix[0:2])
>>> [[0, 1, 2], [3, 4, 5]]
这个输出似乎令人困惑:
print simple_matrix[0:1]
>>> [[0, 1, 2]]
之所以得到此输出,是因为在这种情况下,您不会像在第一个示例中那样从列表中获得单个元素,而是因为您正在对列表列表进行切片。
此切片返回包含切片元素的列表,在这种情况下,仅包含列表[0,1,2]。
答案 4 :(得分:0)
冒号表示法是切片的简写,因此从简短的术语定义和一些简单的例子开始。我会先请您参考this great answer,以首先了解切片的工作原理。这与我称之为“访问符号”或访问<jhi-page-ribbon></jhi-page-ribbon>
之类的数组元素形成了鲜明的对比。
因此,在您的情况下,不同之处在于可以在维度0处访问 n维数组,该数组返回该行中的列系列。相反,将您的n维数组从0切片 会给出一个包含维0的列表,但不包括1,这将是一个二维数组,其中第一个(也是唯一一个)元素是第一行中的一系列列。
关于形状,这取决于您对数据的处理方式。例如,如果您需要一次访问多个行,则一次使用一个更大的切片可能更有意义,而访问符号则需要多个语句或循环。
关于Numpy数组的说明
切片传统的一维数组将始终产生原始数组的一个子集,作为副本。相反,对n维NP数组进行切片会产生view,它与原始数组共享内存。请注意,修改此切片也会修改原始切片!