您的位置:

从多个方面详述np.asarray

一、类型转换

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