Python使用不同的dtypes创建numpy数组

时间:2015-01-09 10:56:54

标签: python arrays numpy complex-numbers

我想创建一个numpy数组(大小约为65000行x17列)。第一列包含复数,其余包含无符号整数。

我首先创建一个所需大小的numpy.zeros数组,之后我想用上面描述的复数和uint填充它。我查看了dtypes选项,其中应该是我认为的解决方案,但我无法让它发挥作用。

之后我想将整个数组保存为CSV文本文件,如下所示:

0.25 + 0.30j,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1

0.30 + 0.40j,0,1,0,0,0,0,0,0,1,0,1,1,1,1,1,1

等...

我在其他人中尝试了这个,但后来它给了我以下错误:

  

TypeError:+:' numpy.ndarray'不支持的操作数类型和   ' numpy.ndarray'

m = 16

dt = numpy.dtype([('comp', numpy.complex), ('f0', numpy.int64), ('f1', numpy.int64),
    ('f2', numpy.int64), ('f3', numpy.int64), ('f4', numpy.int64), ('f5', numpy.int64),
    ('f6', numpy.int64), ('f7', numpy.int64), ('f8', numpy.int64), ('f9', numpy.int64),
    ('f10', numpy.int64), ('f11', numpy.int64), ('f12', numpy.int64), ('f13', numpy.int64),
    ('f14', numpy.int64), ('f15', numpy.int64)])

fields = numpy.zeros((2**m, m+1), dtype=dt)

for i in range(0, m):
    fields[:,0] = fields[:,0] + 1 # for example I add only 1 here

2 个答案:

答案 0 :(得分:3)

也许这就是你想要的:

修改:展平结构,使其更接近您最初的想法,并使用savetxt保存。

import numpy

m = 15
rows = 5

integers = [('f'+str(i), numpy.int64) for i in range(m)]
dt = numpy.dtype([('comp', numpy.complex)] + integers)
fields = numpy.zeros(rows, dtype=dt)

fields['comp'] += 1j
fmt = '%s ' + m*' %u'
numpy.savetxt('fields.txt', fields, fmt=fmt)

注意:数组现在基本上是dt类型元素的向量。 您可以使用fields[row][0]访问复数,fields[row][1]将返回"子阵列"整数。这意味着要更改特定的整数,您需要执行以下操作:fields[row][1][5] = 7

答案 1 :(得分:0)

np.savetxt不能很好地处理具有不同数量值的字段。复杂字段每行有2个值,int只有一个。或Psirus版本中的15个。

savetxt中的基本操作是:

for row in X:
   fh.write(asbytes(format % tuple(row) + newline))

但是你的dtype的行tuple就像(只有2个int字段)

In [306]: tuple(X[1])
Out[306]: ((1+4j), 0, 0)

对于Psirus的dtype:

In [307]: tuple(fields[1])
Out[307]: ((1+4j), array([2, 3], dtype=int64))

很难想出一个格式字符串,它可以在不使用通用%s的情况下工作至少复杂的值。提出一个通过savetxt错误检查的问题仍然很难。

最好编写自己的save例程,根据需要格式化该元组。

savetxt代码随时可供阅读和复制。 asbyte业务是为了兼容Python3。

跳过复杂的dtype可能更容易,并使用普通的2d数组,这是一个编写复杂的“字段”加上几个整数的简单示例,而不需要求助于结构化的dtype。 “复杂”魔法存在于fmt字符串中。

In [320]: Y = np.zeros((5,4),dtype=int)
In [321]: Y[:,0]=np.arange(5)
In [322]: Y[:,1]=np.arange(5,0,-1)
In [323]: Y[:,2]=np.arange(5,0,-1)
In [324]: Y[:,3]=np.arange(10,15)

In [325]: Y
Out[325]: 
array([[ 0,  5,  5, 10],
       [ 1,  4,  4, 11],
       [ 2,  3,  3, 12],
       [ 3,  2,  2, 13],
       [ 4,  1,  1, 14]])

In [326]: np.savetxt('mypy/temp.txt',Y,fmt='%3d+%dj, %3d, %3d')

In [327]: cat mypy/temp.txt
  0+5j,   5,  10
  1+4j,   4,  11
  2+3j,   3,  12
  3+2j,   2,  13
  4+1j,   1,  14