2D numpy数组不会隐式地从int64转换为float64

时间:2017-06-14 06:46:10

标签: python numpy type-conversion

为什么numpy数组是一个向量,设置有效,dtype被隐式转换为float,但是当numpy数组是一个矩阵时,设置有效但dtype仍然是int 。这是一个演示脚本来说明问题。

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

1 个答案:

答案 0 :(得分: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.        ]])