2016-03-03 37 views
1

我想创建一个Python Numpy数组(2,7)指定每列的类型。一些列将是数组。所以我期望的数组应该是这样的:数据类型为2D NumpyArray

[[ (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, 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.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.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, 0.0, 0.0, 0.0, 0.0, 0.0])]] 

我试图

>>> A = np.zeros(shape=(2), dtype= 'int, (3)float, (8)float, (8)float, (8)float, (10)float, (10)float') 

,但我得到一维数组:

>>> 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, 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.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.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, 0.0, 0.0, 0.0, 0.0, 0.0])] 

如果我定义它是这样的:

>>> A = np.zeros(shape=(2,7), dtype= 'int, (3)float, (8)float, (8)float, (8)float, (10)float, (10)float') 

我得到的数组比我想要的大得多;它是(2,7x7)。

虽然这样做,我得到一个错误:

>>> A = np.zeros(shape=([[2],[7]]), dtype= 'int, (3)float, (8)float, (8)float, (8)float, (10)float, (10)float') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: an integer is required 

我不明白怎么去我的输出。任何帮助,可能与解释高度赞赏!谢谢!

回答

3

A = np.zeros(shape=(2), dtype= '...')表示制作一个形状为(2,)的阵列和一个化合物dtype。这正是你得到的。

(2,)是1d形状。它命名了字段而不是列。指定一个(2,7)形状只会生成一个具有相同7个字段的二维数组。

dtype这样你得到了structured array。您可以按名称访问字段,例如A['f0']

阅读关于dtype和结构化数组的文档,如果你想用这种方法得到任何地方。

其他答案会指导您到pandas。这对你的目的可能更好 - 或者不是。但是,pandas使用numpy数组,并且在这种混合数据的情况下,它将使用结构化数组或dtype=object

用更简单的dtype

In [742]: A = np.zeros(shape=(2), dtype= 'int, (3)float, (4)float') 
In [743]: A 
Out[743]: 
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])], 
     dtype=[('f0', '<i4'), ('f1', '<f8', (3,)), ('f2', '<f8', (4,))]) 

第一个字段是整数的一维数组:

In [744]: A['f0'] 
Out[744]: array([0, 0]) 

第三可被视为浮子的2x4的

In [745]: A['f2'] 
Out[745]: 
array([[ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.]]) 

您可以从此阵列中选择一条记录或元素:

In [746]: A[0] 
Out[746]: (0, [0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0]) 

您可以对各个字段执行正常的数值数组操作。但跨领域运作是有限的。

例如,你不能做np.sum(A),跨领域的总和;但你可以作用于一个领域:

In [749]: np.sum(A['f1'],axis=1) 
Out[749]: array([ 0., 0.]) 

结构阵列是最经常通过读取一个CSV文件,其中字段对应的列在文件中创建的,有些列文本。

我举例说明的A可以表示一个文件,其中第一列是记录/行计数器,接下来的3个数字代表一个值,以及以下4个逻辑上不同的值。另一种方法是制作一个浮点数的二维数组。


关于化合物型阵列的设置元素:

In [916]: A = np.zeros(shape=(2), dtype= 'int, (3)float, (4)float') 

我可以设置一个字段的所有值与匹配大小的数组或列表:

In [918]: A['f0']=[1,2] 

我可以设置所有多元素字段的值在同一个地方;在这里,我只是填补他们所有:

In [920]: A['f1']=1 
In [921]: A 
Out[921]: 
array([(1, [1.0, 1.0, 1.0], [0.0, 0.0, 0.0, 0.0]), 
     (2, [1.0, 1.0, 1.0], [0.0, 0.0, 0.0, 0.0])], 
     dtype=[('f0', '<i4'), ('f1', '<f8', (3,)), ('f2', '<f8', (4,))]) 

我可以索引和切片以通常的方式中的一个字段,处理它,在这种情况下,一个二维数组:

In [922]: A['f2'][1,2:]=34 
In [923]: A 
Out[923]: 
array([(1, [1.0, 1.0, 1.0], [0.0, 0.0, 0.0, 0.0]), 
     (2, [1.0, 1.0, 1.0], [0.0, 0.0, 34.0, 34.0])], 
     dtype=[('f0', '<i4'), ('f1', '<f8', (3,)), ('f2', '<f8', (4,))]) 

我不能分配所有一个记录(行)的与值列表中的值,甚至是嵌套一个:

In [924]: A[1]=[3,[1,2,3],[1,2,3,4]] 
... 
TypeError: 'list' does not support the buffer interface 

,但我可以用一个元组

设置

列表和元组之间的区别在处理结构化数组时很重要。在显示A时注意,每条记录都与元组()一起显示。多行A可以用元组列表来设置或初始化。元组的使用在包含数组的维度和dtype内的结构之间绘制线条。

+0

这真的很酷!我当然对官方文档不甚了解,或者文档和实现之间缺乏联系。我希望这能帮助OP解决他的问题。 – innoSPG

+0

谢谢hpaulj!但是,当我创建一个空的二维数组'形状=(2,7)',然后尝试插入一个列表时,我得到这个错误'ValueError:设置一个数组元素的序列。所以我想我需要指定'A [0] [1]',例如,应该是一个由3个浮点数组成的子数组,其他cols等等。怎么做?可能吗? –

+0

我已经在我的'A'数组中添加了一些设置值的例子。 – hpaulj

1

这可能最适合作为评论,我认为它包含足够的信息作为答案。

numpy数组不是你要找的,你最好看看其他工具,如Pandas Dataframe。 你需要了解一个numpy数组是什么;从numpy array的文档,你有这样的语句:

NumPy provides an N-dimensional array type, the ndarray, which describes a collection of “items” of the same type.

而这在某种程度上违背你想达到的目标。从同一个文档,你有这等说法:

An item extracted from an array, e.g., by indexing, is represented by a Python object whose type is one of the array scalar types built in Numpy. The array scalars allow easy manipulation of also more complicated arrangements of data.

这意味着,您所提供的数据类型必须对应于那些标量类型之一。您提供了许多标量类型的字符串。

+0

感谢您的详尽答案。如果我理解正确,我应该全部浮动,例如。我仍然有点困惑,但在[dtypes文档](http://docs.scipy.org/doc/numpy/reference/arrays.dtypes。html)我明白,有可能做我想做的事情。>>> dt = np.dtype(('i4,(2,3)f8,f4',(2,3)))#2 x 3 structured Sub -array'。但是,这可能是不同的。 –

+0

你说得对,你应该全部漂浮,例如。你所说的np.dtype是一个数据结构,而不是一个标量,所以你不能用一个用户定义np.dtype的numpy数组。不过,你也可以建立你想要做的事情。但是你不会有数组给出的简单索引。 – innoSPG

+0

好的!谢谢,这确实很清楚。我是python的新手,有时候numpy数组对我来说有点奇怪。 –

相关问题