我可以通过对字符串列表的开始包含字符串数组;注意S4
D型:
In [690]: data=np.array([['1','0','7.23','two'],['2','3','1.32','four']])
In [691]: data
Out[691]:
array([['1', '0', '7.23', 'two'],
['2', '3', '1.32', 'four']],
dtype='|S4')
它更可能通过读取CSV文件,这样一种阵列创建。
我也可以认为它是单字节字符串数组 - 的形状和D型细胞发生了变化,但对应于DataBuffer是相同的(相同的32个字节)
In [692]: data.view('S1')
Out[692]:
array([['1', '', '', '', '0', '', '', '', '7', '.', '2', '3', 't', 'w',
'o', ''],
['2', '', '', '', '3', '', '', '', '1', '.', '3', '2', 'f', 'o',
'u', 'r']],
dtype='|S1')
事实上,我可以改变单个字节,改变原始数组的two
到twos
:
In [693]: data.view('S1')[0,-1]='s'
In [694]: data
Out[694]:
array([['1', '0', '7.23', 'twos'],
['2', '3', '1.32', 'four']],
dtype='|S4')
但是,如果我尝试的data
的元素改变为一个整数,它被转换成一个字符串匹配S4 D型:
In [695]: data[1,0]=4
In [696]: data
Out[696]:
array([['1', '0', '7.23', 'twos'],
['4', '3', '1.32', 'four']],
dtype='|S4')
如果数字来自int(data[1,0])
或者其中的一些变化,也会发生同样的情况。
但我可以欺骗成看到整数作为字节串(表示为\x04
)
In [704]: data[1,0]=np.array(4).view('S4')
In [705]: data
Out[705]:
array([['1', '0', '7.23', 'twos'],
['\x04', '3', '1.32', 'four']],
dtype='|S4')
阵列可以共享数据缓冲器。 data
属性是指向一块内存的指针。数组的dtype
控制着该块的解释方式。例如,我可以让整数的另一个数组,并重定向它的data
属性:
In [714]: d2=np.zeros((2,4),dtype=int)
In [715]: d2
Out[715]:
array([[0, 0, 0, 0],
[0, 0, 0, 0]])
In [716]: d2.data=data.data # change the data pointer
In [717]: d2
Out[717]:
array([[ 49, 48, 858926647, 1936684916],
[ 4, 51, 842214961, 1920298854]])
现在d2[1,0]
是整数4,但其他项目不可识别的,因为他们被视为整数字符串。这与通过int()
函数传递它们不一样。
我不建议将data
这样的指针改为常规操作。搞砸事情很容易。我必须注意确保d2.nbytes
为32,与data
相同。
因为缓冲区是分片,的变化,以d2
也出现在data
(但显示的根据不同的D型):
In [718]: d2[0,0]=3
In [719]: data
Out[719]:
array([['\x03', '0', '7.23', 'twos'],
['\x04', '3', '1.32', 'four']],
dtype='|S4')
具有复杂D型的视图做类似的东西:
In [723]: data.view('i4,i4,f,|S4')
Out[723]:
array([[(3, 48, 4.148588672592268e-08, 'twos')],
[(4, 51, 1.042967401332362e-08, 'four')]],
dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<f4'), ('f3', 'S4')])
注意48
和51
也出现在d2
。下一个float
列无法识别。
这给出了一个想法,可以和不可以做'就地'。
但是为了以有意义的方式获取包含数字和字符串的数组,我最好构造一个新的结构化数组。也许最干净的方式是使用中间元组列表。
In [759]: dl=[tuple(i) for i in data.tolist()]
In [760]: dl
Out[760]: [('1', '0', '7.23', 'two'), ('2', '3', '1.32', 'four')]
In [761]: np.array(dl,dtype='i4,i4,f,|S4')
Out[761]:
array([(1, 0, 7.230000019073486, 'two'), (2, 3, 1.3200000524520874, 'four')],
dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<f4'), ('f3', 'S4')])
所有这些字段占用4个字节,所以nbytes
是相同的。但个人价值观已通过转换器。我已经给出'np.array'自由转换值,这与输入和新的dtype一致。这比尝试执行某种复杂的就地转换要容易得多。
名单与数字和字符串的混合元组也会工作:
[(1, 0, 7.23, 'two'), (2, 3, 1.32, 'four')]
结构阵列将显示一个元组列表。在结构化数组文档中,值总是以元组列表的形式输入。
recarray
也可以使用,但本质上这只是一个数组子类,它允许您以字段的形式访问字段。
如果原始数组是从csv文件生成的,那么使用np.genfromtxt
(或loadtxt
)和适当的选项会更好。它可以生成适当的元组列表,并直接返回结构化数组。
你的意思是复述http://docs.scipy.org/doc/numpy/reference/generated/numpy.recarray.html? –
'['''''''''''','7.25'''''''']'从哪里来的呢? –
'data'的形状和dtype是什么? – hpaulj