![](/img/trans.png)
[英]NumPy - What is the difference between frombuffer and fromstring?
[英]What is the difference in NumPy between [:][:] and [:,:]?
我对 python 编程非常熟悉,但是我发现了一些奇怪的情况,其中以下两行代码提供了不同的结果(假设两个 arrays 是二维的):
A[:][:] = B[:][:]
和
A[:,:] = B[:,:]
我想知道是否有任何情况,解释。
有什么提示吗?
例子:
>>> x = numpy.array([[1, 2], [3, 4], [5, 6]])
>>> x
array([[1, 2],
[3, 4],
[5, 6]])
>>> x[1][1]
4 # expected behavior
>>> x[1,1]
4 # expected behavior
>>> x[:][1]
array([3, 4]) # huh?
>>> x[:,1]
array([2, 4, 6]) # expected behavior
让我们退后一步。 尝试这个:
>>> x = np.arange(6)
>>> x
array([0, 1, 2, 3, 4, 5])
>>> x[:]
array([0, 1, 2, 3, 4, 5])
>>> x[:][:]
array([0, 1, 2, 3, 4, 5])
>>> x[:][:][:][:][:][:][:][:][:][:]
array([0, 1, 2, 3, 4, 5])
看起来x[:]
等于x
。 (实际上, x[:]
创建了x
的副本。)
因此, x[:][1] == x[1]
。
这是否符合我们的预期? 为什么x[:]
应该是x
的副本? 如果您熟悉切片,这些示例应该可以阐明:
>>> x[0:4]
array([0, 1, 2, 3])
>>> x[0:6]
array([0, 1, 2, 3, 4, 5])
>>> x[0:]
array([0, 1, 2, 3, 4, 5])
>>> x[:]
array([0, 1, 2, 3, 4, 5])
我们可以省略0
和6
,numpy 将计算出我们的最大尺寸。
关于问题的第一部分,要创建B
的副本,您可以执行以下任何操作:
A = B[:, :]
A = B[...]
A = np.copy(B)
通常,我们使用像x,y
这样的坐标,首先是水平坐标,然后是垂直坐标。 因此, numpy
通过按此顺序给出两个坐标,可以方便地访问 2D arrays 中的元素。
但是,二维数组实际上是 arrays 的数组; 注意定义:
foo = numpy.array([
[1, 2],
[3, 4],
[5, 6]
])
如果忽略numpy.array
构造函数,这是一个列表列表。 外部列表包含三个元素(每个元素都是一个列表),索引 1 处的值是foo[1] == [3, 4]
。 这是有道理的,因为矩阵表示为rows列表,因此外部列表中使用的索引控制垂直坐标,即您访问的行。
因此,在像foo[1][0] == 3
这样的表达式中,索引 1 是垂直坐标,而 0 是水平坐标。 也就是说,它相当于写foo[x,y]
。 与通常的约定相比,它是倒退的,但它从逻辑上遵循矩阵是行列表这一事实。 如果矩阵是列列表,则foo[x][y]
将是正确的。
对于numpy
arrays,这同样适用于切片运算符。 表达式foo[:][1]
等价于foo[1,:]
,而不是foo[:,1]
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.