我想创建一个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
答案 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