我无法通过列名从结构化numpy
数组中获取数据。最后是我的相关代码。我认为这很简单,很短,可以整体发布(这是一个sscce acutally)。
如果test.out
文件不存在,则会在data['f3']
文件中生成简单的数据。我总是从文件加载数据,仅用于测试目的。这里并不重要(我认为)。然后,如果文件中的数据是同质的,我强制使用结构化数组。我想通过像shape: (10, 1), data['f3']:
[[ 0.50308252]
[ 0.16259077]
[ 0.5448315 ]
[ 0.77284975]
[ 0.01443514]
[ 0.40232731]
[ 0.6703865 ]
[ 0.3918904 ]
[ 0.07649033]
[ 0.70849585]]
这样的列名来访问数据,但我得到了一些奇怪的形状。我得到一个单元素列表的列表。 E.g:
shape: (10, 1), data['f3']:
[ 0.50308252 0.16259077 0.5448315 0.77284975 0.01443514 0.40232731
0.6703865 0.3918904 0.07649033 0.70849585]
所需的输出是:
data.shape
有趣的是,所有报告的形状都相同(对于dtype
也是如此。
我是否以错误的方式执行reshape
?我很确定可以做到因为this answer显示了具有所需结果的相同语义。我找到了一个col_name = ['f1', 'f3']
的解决方法,但如果有必要的话似乎很奇怪。这也适用于列列表。您可以在我的代码中设置data[col_name]
。有没有办法用简单的import numpy
import os
def get_data():
if not os.path.exists('test.out'):
new_data = numpy.random.rand(10,10)
numpy.savetxt('test.out', new_data, delimiter=',')
data = numpy.genfromtxt('test.out',delimiter=",", dtype=None)
return data
def get_column(spreadsheet, column):
data = spreadsheet[column]
return data.reshape(data.shape[0])
data = get_data()
#if data is homogenous, then forcibly transform into structured array
if data.dtype.names is None:
new_dtype = list(map(lambda z:('f%d'%(z),data.dtype),range(0,data.shape[1])))
#print('old dtype: {}, new dtype: {}'.format(data.dtype, new_dtype))
data.dtype = new_dtype
col_name = 'f3'
print(data.dtype)
print("shape: {}, data:\n{}".format(data.shape, data))
print("shape: {}, data['{}']:\n{}".format(data[col_name].shape, col_name, data[col_name]))
print("shape: {}, data['{}']:\n{}".format(data[col_name].shape, col_name, get_column(data, col_name)))
来完成它?
代码:
{{1}}
答案 0 :(得分:2)
当您指定新的dtype以使data
为结构化数组时,形状将从(10,10)更改为(10,1)。也就是说,它仍然是一个二维数组,第二个维度为长度1.如果结构化数组是由genfromtxt
创建的,那么形状将是(10,)(即它将是一个 - 维数组)。您可以通过在分配dtype后分配新形状来完成相同的操作:
data.shape = data.shape[0]
或用
替换data.dtype = new_dtype
data = data.view(new_dtype).reshape(-1)
然后结构化数组具有形状(10,),data['f3']
也具有形状(10,)。
请注意,从结构化数组中获取字段(例如data
)是一个与data
形状相同的数组。也就是说,data['f3']
始终具有与data
相同的形状。它是结构化数组的'f3'字段的数组。我们经常将这些字段视为“列”(特别是当结构化数组为1-d时),但实际上它们只是结构中字段的名称。