Python使用不同的数据类型创建numpy数组

Python使用不同的数据类型创建numpy数组,python,arrays,numpy,complex-numbers,Python,Arrays,Numpy,Complex Numbers,我想创建一个numpy数组(大小约65000行x 17列)。第一列包含复数,其余列包含无符号整数 我首先创建一个所需大小的numpy.zeros数组,然后像上面描述的那样用复数和uint填充它。我已经研究了dtypes选项,我认为其中应该有解决方案,但我无法让它发挥作用 之后,我想将整个数组保存为CSV文本文件,如下所示: 0.25+0.30j,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1 0.30+0.40j,0,1,0,0,0,0,0,1,0,1,1,1,1,1,1,1

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

我首先创建一个所需大小的
numpy.zeros
数组,然后像上面描述的那样用复数和uint填充它。我已经研究了
dtypes
选项,我认为其中应该有解决方案,但我无法让它发挥作用

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

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

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

等等

我尝试过这一点,但后来它给了我以下错误:

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


也许这就是你想要的:

编辑:将结构展平,因此现在它更接近您最初的想法,您可以使用
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
类型的元素向量。您可以使用
字段[row][0]
访问复数,
字段[row][1]
将返回整数的“子数组”。这意味着要更改特定的整数,您需要执行如下操作:
字段[row][1][5]=7

也许这就是您想要的:

编辑:将结构展平,因此现在它更接近您最初的想法,您可以使用
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
类型的元素向量。您可以使用
字段[row][0]
访问复数,
字段[row][1]
将返回整数的“子数组”。这意味着要更改特定的整数,您需要执行如下操作:
字段[row][1][5]=7

也许这就是您想要的:

编辑:将结构展平,因此现在它更接近您最初的想法,您可以使用
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
类型的元素向量。您可以使用
字段[row][0]
访问复数,
字段[row][1]
将返回整数的“子数组”。这意味着要更改特定的整数,您需要执行如下操作:
字段[row][1][5]=7

也许这就是您想要的:

编辑:将结构展平,因此现在它更接近您最初的想法,您可以使用
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
类型的元素向量。您可以使用
字段[row][0]
访问复数,
字段[row][1]
将返回整数的“子数组”。这意味着要更改特定的整数,您需要执行如下操作:
字段[row][1][5]=7
np.savetxt
无法很好地处理具有不同值数的字段。一个复杂字段每行有2个值,一个整型字段只有一个值。或者在Psirus的版本中是15

savetxt
中的基本操作是:

for row in X:
   fh.write(asbytes(format % tuple(row) + newline))
但是数据类型的行
元组
类似于(仅用于2个int字段)

对于Psirus的数据类型:

In [307]: tuple(fields[1])
Out[307]: ((1+4j), array([2, 3], dtype=int64))
如果不使用泛型的
%s
,很难找到一个格式字符串,至少对于复杂的值是这样的。更难想出一个通过
savetxt
错误检查的方法

最好编写自己的
save
例程,该例程可以完全按照您的需要设置元组的格式

savetxt
代码易于阅读和复制。
asbyte
业务是为了与Python3兼容

跳过复杂的数据类型并使用普通的2d数组可能更容易,下面是一个简单的示例,说明如何在不使用结构化数据类型的情况下编写一个复杂的“字段”加上几个整数。“复杂”的魔力存在于
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

np.savetxt
无法很好地处理具有不同数值的字段。一个复杂字段每行有2个值,一个整型字段只有一个值。或者在Psirus的版本中是15

savetxt
中的基本操作是:

for row in X:
   fh.write(asbytes(format % tuple(row) + newline))
但是数据类型的行
元组
类似于(仅用于2个int字段)

对于Psirus的数据类型:

In [307]: tuple(fields[1])
Out[307]: ((1+4j), array([2, 3], dtype=int64))
如果不使用泛型的
%s
,很难找到一个格式字符串,至少对于复杂的值是这样的。更难想出一个通过
savetxt
错误检查的方法

最好编写自己的
save
例程,该例程可以完全按照您的需要设置元组的格式

savetxt
代码易于阅读和复制。
asbyte
业务是为了与Python3兼容

跳过复杂的数据类型并使用普通的2d数组可能更容易,下面是一个简单的示例,说明如何在不使用结构化数据类型的情况下编写一个复杂的“字段”加上几个整数。“复杂”的魔力存在于
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

np.savetxt
无法很好地处理具有不同数值的字段。一个复杂字段每行有2个值,一个整型字段只有一个值。或者在Psirus的版本中是15

savetxt
中的基本操作是:

for row in X:
   fh.write(asbytes(format % tuple(row) + newline))
但是数据类型的行
元组
类似于(仅用于2个int字段)

对于Psirus的数据类型:

In [307]: tuple(fields[1])
Out[307]: ((1+4j), array([2, 3], dtype=int64))
如果不使用泛型的
%s
,很难找到一个格式字符串,至少对于复杂的值是这样的。更难想出一个通过
savetxt
错误检查的方法

最好编写自己的
save
例程,该例程可以完全按照您的需要设置元组的格式

savetxt
cod