我有一个普遍性的问题,但没有人能够给我答案。我在Python官方文档和其他来源(如bootcamp和datacamp)中进行了大量搜索。
问题是,我在所有地方都看到numpy不支持异构数据类型(官方文档)
但是,当我写下面的代码时,它可以正常工作。那么,如果numpy不支持异构数据类型,为什么编码允许呢?
import numpy as np
x = np.array(["hello", 3, 4, 5])
print(a)
上述语句成功执行。
我有一个普遍性的问题,但没有人能够给我答案。我在Python官方文档和其他来源(如bootcamp和datacamp)中进行了大量搜索。
问题是,我在所有地方都看到numpy不支持异构数据类型(官方文档)
但是,当我写下面的代码时,它可以正常工作。那么,如果numpy不支持异构数据类型,为什么编码允许呢?
import numpy as np
x = np.array(["hello", 3, 4, 5])
print(a)
上述语句成功执行。
我试过了,实际上它是均匀的!看看这个:
>>> np.array(["hello", 1, 2, 3])
array(['hello', '1', '2', '3'], dtype='<U5')
U
类型,长度为5或更少。因此所有整数都被转换为unicode /字符串类型,从而使数组变得同质化!
尝试强制转换为int
将会抛出错误:
np.array(["hello", 1, 2, 3], dtype=np.int)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'hello'
x = np.array(['hello', 1, 2, 3, float])
将是 object
数据类型,并且它可能会为每个元素存储对 Python 对象的引用或类似的东西。您可以使用 sys.getsizeof
查看所有这些不同数组占用的空间量。 - Reti43dtype
)。数组中的所有元素都必须符合该类型或强制转换为它。就这样。object
dtype,它允许您存储任何Python值,包括列表或字典。arr = np.array((1, 2.5, 'foo'), dtype=object)
print(type(arr[0]), type(arr[1]), type(arr[2]))
提供:
<class 'int'> <class 'float'> <class 'str'>
dtype=object
基本意味着“指向 CPython 对象的引用(指针)”。而且你必须小心处理 type(arr[i])
,因为它将返回装箱类型。当然,所有 Python 对象都是这样工作的,因为一切都是“对象的引用”...但是,在思考 NumPy 时,这里存在微妙之处。 - juanpa.arrivillaga
'<U5'
。 - juanpa.arrivillaga