numpy的array、asarray、asanyarray的区别
从librosa.filters.mel里遇到该问题:
def mel_to_hz(mels, htk=False):
mels = np.asanyarray(mels)
先看一个例子:
>> A = numpy.matrix(np.ones((3,3)))
>>> A
matrix([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.]])
如果是array:
>>> numpy.array(A)[2]=2 #将第3行全部置2
>>> A
matrix([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.]])
# 可以看到A没变,所以array修改的是A的拷贝。
如果是asarray:
>>> numpy.asarray(A)[2]=2
>>> A
matrix([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 2., 2., 2.]])
# 可以看到asarray修改的A本身。
np.asanyarray :
看名字就是 as any array,就是任何形式都会被转化为数组;如果输入的已经是满足要求的数组或数组的子类,则不会复制,直接返回。
>>>a = [1, 2]
>>>np.asanyarray(a)
array([1, 2])
>>>a = np.array([(1.0, 2), (3.0, 4)], dtype='f4,i4').view(np.recarray)
>>>np.asanyarray(a) is a
True
区别:
np.asanyarray 会返回 ndarray 或者ndarray的子类,而np.asarray 只返回 ndarray:
issubclass(np.matrix, np.ndarray)
True
>>> a = np.matrix([[1, 2]])
>>> np.asarray(a) is a #返回的不是子类。
False
>>> np.asanyarray(a) is a #np.asanyarray(a)返回是a的子类
True
这个没太理解
# 示例代码1
import numpy as np
a=np.array([[1,2,3],[4,5,6]])
print(a)
# [[1 2 3]
# [4 5 6]]
np.array(a)[1]=[7,8,9]
print(a)
# [[1 2 3]
# [4 5 6]]
np.asarray(a)[1]=[7,8,9]
print(a)
# [[1 2 3]
# [7 8 9]]
np.asanyarray(a)[1]=[7,8,9]
print(a)
# [[1 2 3]
# [7 8 9]]