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