【问题标题】:Numpy: Understanding Array to the power of ArrayNumpy:了解 Array 的强大功能
【发布时间】:2019-09-25 09:24:56
【问题描述】:

我正在审查带有 numpy 数组的运算符,我发现了一些我没有预料到并且我不知道如何解释的东西。

我正在执行的操作是数组 A 的数组 B 的幂,显然 A 和 B 具有相同的形状。我期待的行为是“元素级幂”:A 中的每个元素都与 B 中相应元素的幂次之比。但是,似乎还有其他事情正在发生。

import numpy as np

values = list(range(1, 10))
array_1d = np.array(values)

print(array_1d ** (array_1d * 5))

所以我将[1, 2, 3, 4, 5, 6, 7, 9] 设为[5, 10, 15, 20, ...] 的幂。 预期的结果(在我的脑海中)相当于[v ** (v*5) for v in list(range(1,10))],即:

 [1,
 1024,
 14348907,
 1099511627776,
 298023223876953125,
 221073919720733357899776,
 378818692265664781682717625943,
 1329227995784915872903807060280344576,
 8727963568087712425891397479476727340041449].

但是输出是:

array([ 1, 1024, 14348907, 0, 167814181, 1073741824, 613813847, 0, -1054898967], dtype=int32)

有人知道这个结果的原因吗?这里到底发生了什么? 谢谢!

【问题讨论】:

  • numpy 中的 int32 数据类型在 -2147483648 到 2147483647 的范围内。大于此的数字会导致溢出。对于numpy 中的最大数字,请使用array_1d = np.array(values, dtype=float)

标签: python arrays numpy matrix


【解决方案1】:

dtype=int32 你溢出整数并循环返回:

1099511627776 % (2**32) == 0
298023223876953125 % (2**32) == 167814181
...

【讨论】:

  • 嗯,有趣。不过,8727963568087712425891397479476727340041449 % (2**32) == -1054898967 呢?那绝对是假的!
  • 不,不是。类型是 signed int32,因此可表示的数字从 -2**312**31-1。根据溢出的发生方式,如果 MSB 为 1,则该数字在 int32 中将被解释为负数
【解决方案2】:

问题是使用的数据类型,试试:

v = arange(1,10, dtype='int32')
print(v ** (5*v))

v = arange(1,10, dtype='int64')
print(v ** (5*v))

v = arange(1,10, dtype='float')
print(v ** (5*v))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-21
    • 2015-04-17
    • 2020-02-16
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多