【发布时间】:2019-10-13 11:54:51
【问题描述】:
某种意义上,这已经有an excellent answer:
人们不应该想太多。这最终对个人的心理健康和长寿有好处。
心理健康长寿固然不错,但是这个人的自尊心又如何,试图变得聪明却被 numpy 残忍地否认了:
考虑以下我们从一些字节数据开始的地方:
a = np.linspace(0,255,6, dtype=np.uint8)
a
# array([ 0, 51, 102, 153, 204, 255], dtype=uint8)
假设我们想要添加一些东西并提升类型,所以它不会环绕。对于标量,这是行不通的:
b = np.uint16(1)
a + b
# array([ 1, 52, 103, 154, 205, 0], dtype=uint8)
但是对于数组,它确实:
c = np.ones(1, np.uint16)
a + c
# array([ 1, 52, 103, 154, 205, 256], dtype=uint16)
所以我想让我们做一个数组。
b[...]
# array(1, dtype=uint16)
np.isscalar(b[...])
# False
但是,唉:
a + b[...]
# array([ 1, 52, 103, 154, 205, 0], dtype=uint8)
为什么这个 0d 数组在这里表现得像一个标量?
【问题讨论】:
-
实际上
np.isscalar(b)和b=np.uint(16)为我返回了True。你用的是什么版本? Numpy 1.15 在这里。 -
np.isscalar(b[...])怎么样(确保不要错过省略号)? -
这是
False...!但是医生说你应该几乎在任何地方都使用ndim。 -
np.isscalar(b[...])在 Numpy 1.16.3 上为 False,因为 b[...] 确实是一个 numpy 数组。我认为这个答案 (stackoverflow.com/a/42191121/10640534) 会有所帮助。 -
因为一个0维数组是一个ndarray实例只包含一个数组标量
标签: python numpy scalar type-promotion