numpy 在Python中滑动2数组元素

8yoxcaq7  于 2023-05-13  发布在  Python
关注(0)|答案(2)|浏览(95)

我想在python中使用两个元素。当元素本身是一个数字时,它起作用。但是当元素本身是一个数组时,它失败了。有谁能告诉我这是什么原因吗?谢谢你的帮助。详情如下。

import numpy as np

# Section 1
points = np.array([1, 2, 3, 4])
temp = points[0]
points[0] = points[1]
points[1] = temp

print(points)
# This will print [2 1 3 4] and it works

# Section 2
points = np.array([[1, 2], [2, 3], [3, 4]])
temp = points[0]
points[0] = points[1]
points[1] = temp

# This will print 
#[[2 3]
# [2 3]
# [3 4]] which fails

我想知道为什么在使用相同的方法时会失败。我尝试将第2节中的temp = points[0]更改为temp = points[0].copy(),并且可以正常工作。但是由于temp首先得到元素。为什么在后面的points[1] = temp行中发生了变化?

o7jaxewo

o7jaxewo1#

当你有一个超过1维的numpy数组时,用整数索引它会返回一个视图

>>> import numpy as np
>>> arr = np.arange(10).reshape(5,2)
>>> arr
array([[0, 1],
       [2, 3],
       [4, 5],
       [6, 7],
       [8, 9]])
>>> row_view = arr[0]
>>> row_view
array([0, 1])
>>> row_view.flags
  C_CONTIGUOUS : True
  F_CONTIGUOUS : True
  OWNDATA : False
  WRITEABLE : True
  ALIGNED : True
  WRITEBACKIFCOPY : False

注意,OWNDATA为false!

>>> arr[0, 1] = 99
>>> arr
array([[ 0, 99],
       [ 2,  3],
       [ 4,  5],
       [ 6,  7],
       [ 8,  9]])
>>> row_view
array([ 0, 99])
>>> row_view[0] = -99
>>> row_view
array([-99,  99])
>>> arr
array([[-99,  99],
       [  2,   3],
       [  4,   5],
       [  6,   7],
       [  8,   9]])

每当你索引到一个单独的元素时,numpy都会返回一个新的、独立的“装箱”对象:

>>> arr = np.arange(10)
>>> x = arr[0]
>>> x.shape
()
>>> x
0
>>> x.flags
  C_CONTIGUOUS : True
  F_CONTIGUOUS : True
  OWNDATA : True
  WRITEABLE : False
  ALIGNED : True
  WRITEBACKIFCOPY : False
w1e3prcc

w1e3prcc2#

当执行temp = points[0]时,您正在创建对数组第一行的引用,而不是创建具有相同值的新数组。因此,之后对points所做的任何更改都将更改temp
这种行为特定于numpy数组(也包括torch和tensorflowTensor),它不适用于原生python列表。

相关问题