2017-06-14 53 views
0

为什么当numpy的阵列是一个向量,设置工程和dtype被隐式转换为float但当numpy的阵列是矩阵,设置工程,但dtype仍然是int。这里有一个演示脚本来说明问题。2D numpy的阵列不隐式地从Int64类型转换为float64

import numpy as np 

# successfully sets/converts 
x = np.array([100, 101]) 
c = -np.max(x) 
x += c 
print 'before', x.dtype 
x = np.exp(x) 
print 'after', x.dtype 

print x 

# doesn't successfully set/convert 
matrix = np.array([(100, 101), (102, 103)]) 
for i in range(len(matrix)): 
    c = -np.max(matrix[i]) 
    matrix[i] += c 
    print 'before', matrix[i].dtype 
    matrix[i] = np.exp(matrix[i]) 
    print 'after', matrix[i].dtype 

print matrix 

输出:

before int64 
after float64 <-- from vector 
[ 0.36787944 1.  ] 
before int64 
after int64 <-- from row 1 of matrix 
before int64 
after int64 <-- from row 2 of matrix 
[[0 1] 
[0 1]] 

的数字是整数截断,这是我原来的问题,追踪到这一点。我使用的是Python 2.7.11numpy 1.13.0

+0

Python和numpy版本? –

+0

Python的2.7.11和numpy的1.13.0 – Sticky

回答

2

当你写一个值到一个现有的阵列

,该值转换为数组dtype匹配。在你的情况下,最终float64值转换为int64

b = numpy.arange(4).reshape(2, 2) 
b.dtype # dtype('int64') 

采取的任何这些值numpy.exp()将返回float64

numpy.exp(b[0, :]).dtype # dtype('float64') 

,但如果你现在拿这个float64和写回进入原始int64阵列,需要先投:

b[0, :] = numpy.exp(b[0, :]) 
b.dtype # dtype('int64') 

请注意,使用

b = numpy.exp(b) 

创建一个具有自己的dtype的新阵列。如果您改为

b[:] = numpy.exp(b[:]) 

您可能会再次默认投射到int64

另外请注意,没有必要像你这样写一个循环。相反,您可以矢量化操作:

np.exp(matrix - numpy.max(matrix, axis=1, keepdims=True)) 
# array([[ 0.36787944, 1.  ], 
#  [ 0.36787944, 1.  ]]) 
+0

为什么矢量版本的作品,但?它最初也是一个'int64'数组,但通过简单的设置自动转换为'float64'。 – Sticky

+0

我已经修改了我的答案来回答这个问题。 –

+0

噢我看到这样'B'被完全而对于矩阵中,每行被写回到原始数组设置为一个完全新的阵列。 – Sticky

相关问题