NumPy中array和asarray的区别

我在学习图像处理的时候转数组接触了asarray函数,看它的使用说明和array好像也没有什么具体差别,但做完分析之后发现了它们两个的一些差别。

希望能够耐心看完

一、列表创建

其实这两个函数的用法一模一样,只有一些细微差别,如下

# 当我们根据列表去创建ndarray时
li = [[1,2,3],[1,2,3],[1,2,3]]
a1 = np.array(li)
b1 = np.asarray(li)
li[1][1] = 11111
print(a1)
print(b1)
[[1 2 3]
 [1 2 3]
 [1 2 3]]
[[1 2 3]
 [1 2 3]
 [1 2 3]]
# 可以看到输出正常,都是一个二维的数组

创建完成之后修改原数组的值也不会对新数组有任何影响

二、数组创建

这部分就是关键的差异

# 再尝试使用ndarray创建数组
ar = np.random.randint(2,10,(2,2))
a = np.array(ar)
b = np.asarray(ar)
ar[1][0] = 66
print(a)
print(b)
print(a.dtype,b.dtype)
[[9 4]
 [9 2]]
[[ 9  4]
 [66  2]]
int32 int32

我使用随机库生成一个ndarray数组,再通过这个数组生成新的数组

通过输出可以一个奇怪的现象,当我们修改源ndarray时,使用asarray生成的数组值也相应发生了改变,我们可以得到一个猜想,是不是它与源数组使用的同一个对象地址,为了验证我们继续操作
 

# 当我修改用asarray指定生成b的元素类型时,这里指定的类型与不指定的默认类型相同
b = np.asarray(ar,dtype='int32')
# 重复上述操作,发现
[[9 4]
 [9 2]]
[[ 9  4]
 [66  2]]

看到得到的结果仍然发生了改变,那我们换一个不同的类型呢?

b = np.asarray(ar,dtype='int8')
[[8 4]
 [2 2]]
[[8 4]
 [2 2]]
int32 int8

惊奇的事情发生了,数组的值没有被改变,我突然发现了什么。也就是说,如果我不指定新生成数组的类型,那么它可能和源数组使用的是一个对象,或者说存在某种映射关系,当我们修改源数组的值时,这个数组也会发生改变

b[1][0] = 666666
print(ar)
[[     9      7]
 [666666      2]]
# 我再次测试,创建时不指定,创建后再修改数组类型
ar = np.random.randint(2,10,(2,2))
a = np.array(ar)
b = np.asarray(ar)
b = b.astype('int64')
a = a.astype('int8')
b[1][0] = 666111
print(a)
print(b)
print(a.dtype,ar.dtype,b.dtype)
print(ar)
[[8 5]
 [4 8]]
[[     8      5]
 [666111      8]]
int8 int32 int64
[[8 5]
 [4 8]]

其实很容易就可以想到,重新修改类型那么必然得到一个新的数组,这样得到的数组就一定与原数组没有关系了,所以后续再次修改值也是无法同步的

那么通过上述操作,我们就可以得知这两个函数的区别了

三、总结

当使用列表创建
         - array与asarray相同,生成一个新数组
当使用数组创建
         - array:正常创建,新旧数组除数值和形状外没有关系
         - asarray:1.不指定类型:得到的数组与原数组属于一种映射关系,当其中一个发生改变,另一个也会随之改变
                           2.指定类型:得到的新旧数组与array创建的一样没有关系

以上~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值