如何(简单地)构建一个整数和浮点混合numpy数组

2024-04-24 15:56:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我只想创建一个大小为(N,m)的numpy数组,其中第一列由integer组成,其余列默认为float。 因此,如果初始化为零,则应为结果:

array([[ 0,  0.,  0.,  0.,  0.],
       [ 0,  0.,  0.,  0.,  0.],
       [ 0,  0.,  0.,  0.,  0.],
       [ 0,  0.,  0.,  0.,  0.],
       [ 0,  0.,  0.,  0.,  0.]])

在尝试创建这样一个结构化数组时,我所做的所有尝试都会返回一些元组子元素。


Tags: numpy元素integer数组floatarray结构化元组
3条回答

可以将数组与dtype = object一起使用:

>>> arr = np.ndarray((10,4),dtype = object)
>>> arr[:,0] = int(10)
>>> arr[:,1:] = float(10)
>>> arr
array([[10, 10.0, 10.0, 10.0],
       [10, 10.0, 10.0, 10.0],
       [10, 10.0, 10.0, 10.0],
       [10, 10.0, 10.0, 10.0],
       [10, 10.0, 10.0, 10.0],
       [10, 10.0, 10.0, 10.0],
       [10, 10.0, 10.0, 10.0],
       [10, 10.0, 10.0, 10.0],
       [10, 10.0, 10.0, 10.0],
       [10, 10.0, 10.0, 10.0]], dtype=object)

注意在做算术时你得到了正确的行为。

>>> arr / 3
array([[3, 3.33333333333, 3.33333333333, 3.33333333333],
       [3, 3.33333333333, 3.33333333333, 3.33333333333],
       [3, 3.33333333333, 3.33333333333, 3.33333333333],
       [3, 3.33333333333, 3.33333333333, 3.33333333333],
       [3, 3.33333333333, 3.33333333333, 3.33333333333],
       [3, 3.33333333333, 3.33333333333, 3.33333333333],
       [3, 3.33333333333, 3.33333333333, 3.33333333333],
       [3, 3.33333333333, 3.33333333333, 3.33333333333],
       [3, 3.33333333333, 3.33333333333, 3.33333333333],
       [3, 3.33333333333, 3.33333333333, 3.33333333333]], dtype=object)

或者可以使用^{}

>>> import numpy as np
>>> arr = np.recarray(10,dtype=[('x',int),('y',float,4)])
>>> arr[:] = 0
>>> arr
rec.array([(0, array([ 0.,  0.,  0.,  0.])), (0, array([ 0.,  0.,  0.,  0.])),
           (0, array([ 0.,  0.,  0.,  0.])), (0, array([ 0.,  0.,  0.,  0.])),
           (0, array([ 0.,  0.,  0.,  0.])), (0, array([ 0.,  0.,  0.,  0.])),
           (0, array([ 0.,  0.,  0.,  0.])), (0, array([ 0.,  0.,  0.,  0.])),
           (0, array([ 0.,  0.,  0.,  0.])), (0, array([ 0.,  0.,  0.,  0.]))], 
  dtype=[('x', '<i4'), ('y', '<f8', (4,))])
>>> arr['x']
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
>>> arr['y']
array([[ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.]])

如果需要对所有值进行算术运算,则必须分别对每个字段执行运算,例如

>>> arr['x'] += 2
>>> arr['y'] += 2

虽然我能想到很多理由,为什么你一开始就不想这么做,但这不是由我来判断的,我讨厌别人试图贬低我自己快速而肮脏的黑客行为的价值。

其基本原理是使用dtype=object。由于Python中的所有内容都是一个对象,因此可以混合数字类型,同时仍然保持数组中的同质性。我建议如下,但你显然可以适应自己的需要:

import numpy

rows = 5
a = numpy.zeros((rows,5)).astype(object)
a[:,0] = a[:,0].astype(int)
print a

[[0  0.0  0.0  0.0  0.0]
 [0  0.0  0.0  0.0  0.0]
 [0  0.0  0.0  0.0  0.0]
 [0  0.0  0.0  0.0  0.0]
 [0  0.0  0.0  0.0  0.0]]

请阅读numpy文档中的内容,该文档指出所有成员必须属于同一类型

NumPy's main object is the homogeneous multidimensional array. It is a table of elements (usually numbers), all of the same type, indexed by a tuple of positive integers.

相关问题 更多 >