我只想创建一个大小(N,m)的numpy数组,它只有第一列由整数构成,其余的默认为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.]])
在尝试创建这样的结构化数组时,我所做的所有尝试都返回了一些元组子元素。
答案 0 :(得分:16)
您可以使用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)
或者您可以使用numpy.recarray
:
>>> 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
答案 1 :(得分:2)
虽然我可以想到很多理由,为什么你不应该首先想要这样做,但我不能判断,我讨厌人们试图减少我自己的快速'n'的价值肮脏的黑客。
理由是使用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]]
答案 2 :(得分:1)
在numpy文档中阅读此内容,该文档表明所有成员必须属于同一类型
NumPy的主要对象是同构多维数组。它是一个 元素表(通常是数字),所有相同的类型,索引 一个正整数元组。