Python笔记(六) -- Numpy [下]

一、副本和视图

  • 副本是一个数据的完整的拷贝,如果我们对副本进行修改,它不会影响到原始数据。物理内存不在同一位置。
  • 视图是数据的一个引用,原有数据不会产生拷贝。通过该引用可访问、操作原有数据。如果我们对视图进行修改,它会影响到原始数据。物理内存在同一位置。

1.1 ' = ' 赋值

‘ = ’赋值不会创建数组对象的副本。 它使用原始数组的相同id()来访问它。一个数组的任何变化都反映在另一个数组上。 例如,一个数组的形状改变也会改变另一个数组的形状。

a = np.arange(6)
b = a               # 等号赋值

# 内存地址相同
print(id(a))        # 1588378502768
print(id(b))        # 1588378502768
# 修改数值【变】
b[1] = 555
print(a)            # [0 555 2 3 4 5]
print(b)            # [0 555 2 3 4 5]
# 修改形状【变】
a.shape = (2, 3)
print(a)            # [[0 555 2] [3 4 5]]
print(b)            # [[0 555 2] [3 4 5]]

1.2 切片 

对视图的修改会直接反映到原数据中。但是我们观察 a,b 的 id,他们是不同的,也就是说,视图虽然指向原数据,但是他们和赋值引用还是有区别的。

arr = np.arange(6)
a = arr[1:]          # 切片赋值
b = arr[1:]
print(arr)           # [0 1 2 3 4 5]
print(a)             # [1 2 3 4 5]
print(b)             # [1 2 3 4 5]
# 内存地址不同
print(id(arr))       # 2336936068720
print(id(a))         # 2336937813616
print(id(b))         # 2336950756736
# 修改数值【变】
a[1] = 555
print(arr)           # [0  1   555 3 4 5]
print(a)             # [1  555  3  4 5 ]
print(b)             # [1  555  3  4 5 ]
# 修改形状【不变】
c = arr[:]
print(c)             # [0 1 555 3 4 5]
c.shape=(2,3)
print(c)             # [[0 1 555] [3  4  5]]
print(a)             # [1 555 3 4 5]

1.3 ndarray.view() 

ndarray.view() 方会创建一个新的数组对象,该方法创建的新数组的维数更改不会更改原始数据的维数。

a = np.arange(6).reshape(2, 3)
b = a.view()                    # view()赋值
print(a)                        # [[0 1 2] [3 4 5]]
print(b)                        # [[0 1 2] [3 4 5]]
# 内存地址不同
print(id(a))                    # 3013460633200
print(id(b))                    # 3013473445168
# 修改数值【变】
a[0][1] = 555
print(a)                        # [[0 555 2] [3 4 5]]
print(b)                        # [[0 555 2] [3 4 5]]
# 修改形状【不变】
b.shape = (1, 6)
print(b)                        # [[0 555 2 3 4 5]]
print(a)                        # [[0 555 2] [3 4 5]]

1.4 ndarray.copy() 

darray.copy() 函数创建一个副本。 对副本数据进行修改,不会影响到原始数据,它们物理内存不在同一位置。

a = np.array([[1, 2, 3], [4, 5, 6]])
b = a.copy()  # b与a不共享任何内容

# 修改数值【不变】
b[0, 0] = 100
print(b) # [[100 2 3] [4 5 6]]
print(a) # [[1  2  3] [4 5 6]]

 

二、数组操作

2.1 修改数组形状

  • np.reshape() 函数可以在不改变数据(视图)的条件下修改形状,共享数据。
  • np.ndarray.flat() 是一个数组元素迭代器,相当于np.nditer(ndarray).
  • np.ndarray.flatten() 展平的数组元素,返回一份数组拷贝,对拷贝所做的修改不会影响原始数组
  • np.ravel() 展平的数组元素,顺序通常是"C风格",返回的是数组视图,修改会影响原始数组。
a = np.arange(6)
b = a.reshape(2, 3)

print(a)     # [0 1 2 3 4 5]
print(b)     # [[0 1 2] [3 4 5]]
b[0][0]=9
print(a)     # [9 1 2 3 4 5]
print(b)     # [[9 1 2] [3 4 5]]
a = np.arange(6).reshape(2, 3)

for row in a:
    print(row)
'''
[0 1 2]
[3 4 5]
'''

# 对数组中每个元素都进行处理,可以使用flat属性,该属性是一个数组元素迭代器:
for element in a.flat:
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值