从多个方面详述np.asarray

发布时间:2023-05-20

一、类型转换

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 类型。最后,我们可以用对应的字段名提取出姓名和年龄分别作为一个数组。