一、类型转换
np.asarray
是 numpy 中一个重要的函数,在科学计算领域被广泛使用。它的主要作用是将输入数据转换为 ndarray 数组类型。当输入数据为 ndarray 类型时,np.asarray()
不会造成任何数据复制,但对于其他的数据类型,np.asarray()
会新创建一个新的 ndarray。
通过 np.asarray()
,我们可以将 list、tuple 等数据类型转化为 ndarray 数组类型。
import numpy as np
lst = [1, 2, 3]
arr = np.array(lst)
as_arr = np.asarray(lst)
print(arr is as_arr) # True
当我们将 list 转换为 ndarray 类型时,会发现如果直接使用 np.array()
和 np.asarray()
,输出数组的类型是一样的。但是,np.array()
每次都会复制一份数据,而 np.asarray()
则不会造成数据的浪费,这在数据量大时非常重要。
二、广播机制
在 ndarray 中,广播机制能够帮助我们在对形状不同的数组进行操作时,自动转化成统一的形状进行计算。np.asarray()
函数的一个重要用途就是广播机制。
import numpy as np
a = np.arange(3)
b = 1
c = np.asarray(a) + b
print(c)
在上面的代码中,我们将一个形状为 (3,) 的 ndarray 和一个标量相加,由于标量的形状为 (),与 ndarray 可进行广播,广播后得到的结果为一个大小也为 (3,) 的 ndarray。
三、深拷贝
当我们需要对一个 ndarray 进行深拷贝时,可以使用 np.asarray()
函数进行实现。
import numpy as np
a = np.array([1, 2, 3])
b = np.asarray(a, dtype='float64')
c = np.copy(a)
a[0] = 10
print(a) # [10 2 3]
print(b) # [10. 2. 3.]
print(c) # [1 2 3]
在上面的代码中,我们使用 np.asarray()
函数将一个整型的 ndarray 转换为浮点型的 ndarray,且复制了一份新的数组 b。此时,a 数组的第一个元素被修改成了 10,但是复制出的 b 数组中的第一个元素没有发生改变。而 c 数组是直接复制的 a 数组,当 a 数组的元素发生改变时,c 数组也会发生相应变化。
四、快速创建 ndarray
np.asarray()
函数还可以用于快速创建 ndarray,和 np.zeros()
、np.ones()
等函数类似。
import numpy as np
a = np.asarray([1, 2, 3])
b = np.asarray((1, 2, 3))
c = np.asarray('hello world')
print(a) # [1 2 3]
print(b) # [1 2 3]
print(c) # 'hello world'
在上面的代码中,我们用 np.asarray()
函数快速创建 ndarray,分别用 list、tuple 和字符串作为参数。注意,当输入字符串时,np.asarray()
会把每一个字符分割开成单个元素,而不是一个字符串元素。
五、应用于自定义数据类型
当我们需要对自定义的数据类型进行操作时,np.asarray()
也是一个非常有效的函数。
import numpy as np
dt = np.dtype([('name', 'S10'), ('age', np.int)])
people_info = [('Mike', 18), ('Emma', 20), ('Will', 25)]
people = np.asarray(people_info, dtype=dt)
print(people['name']) # [b'Mike' b'Emma' b'Will']
print(people['age']) # [18 20 25]
在上面的代码中,我们定义了一个叫做 dt 的自定义数据类型,包含两个字段:name 和 age。接着,我们输入了三个人的信息,每个人有姓名和年龄两个属性,然后通过 np.asarray()
函数将这些人的信息转换为 ndarray 类型。最后,我们可以用对应的字段名提取出姓名和年龄分别作为一个数组。