【问题标题】:Left shift inconsistancy左移不一致
【发布时间】:2016-06-07 03:53:18
【问题描述】:

我昨天问了一个很好的问题answered by @jezrael

在这个他使用:

df = pd.DataFrame([[1, 0, 1], [1, 1, 0], [0, 1, 1], [0, 0, 1]])

print (df.T.dot(1 << np.arange(df.shape[0] - 1, -1, -1)))

0    12
1     6
2    11
dtype: int64

1 &lt;&lt; np.arange(df.shape[0]) 适用于小于 30 的 df.shape[0],但在那之后就崩溃了。考虑到 int32 或 int64 的数据类型,这也是可以理解的。会有一个限制。但是,当我使用int 操作数执行左移&lt;&lt; 时,它会返回long 并保持准确性。如何使用 numpy 获得与使用 1 &lt;&lt; 60 时相同的结果?

这是我跑的:

import numpy as np



for n in range(0, 61, 10):
    a = np.arange(n + 1, dtype=int)

    pstr = "for n = {:<5d}; 1 << a[-1] = {:<12d}; 1 << n = {:<12d}" 
    print pstr.format(n, 1 << a[-1], 1 << n)

for n = 0    ; 1 << a[-1] = 1           ; 1 << n = 1           
for n = 10   ; 1 << a[-1] = 1024        ; 1 << n = 1024        
for n = 20   ; 1 << a[-1] = 1048576     ; 1 << n = 1048576     
for n = 30   ; 1 << a[-1] = 1073741824  ; 1 << n = 1073741824  
for n = 40   ; 1 << a[-1] = 256         ; 1 << n = 1099511627776
for n = 50   ; 1 << a[-1] = 262144      ; 1 << n = 1125899906842624
for n = 60   ; 1 << a[-1] = 268435456   ; 1 << n = 1152921504606846976

【问题讨论】:

  • int32 不能大于 2147483647,那么您希望 1&lt;&lt;60 是什么?
  • @Daniel 当我运行1 &lt;&lt; 60 时,我得到1152921504606846976 很长。
  • 但是这个值对于 int32 来说太大了。那么您期望的 int32 值是多少?
  • 我不希望有一个 int32。我很清楚 numpy 正在提供一个 int32 或 int64 数组。我想要一个长数组。

标签: python numpy


【解决方案1】:

您必须将 int32 数组转换为 python 对象数组:

numbers = np.arange(100,dtype=int)
longs = 1 << np.arange(100).astype(object)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-18
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多