2017-05-06 63 views
1

之前由于我是新来的整个“巨蟒”的事情我遇到以下问题:提取选择从numpy的3D矩阵列和行节约

  1. 我有定形的数据文件.npy(77,77 ,20)。我想从这个文件中提取25行,得到一个像(25,25,20)一样的新矩阵。行和列不是前25或最后25.我创建了2个变量“col_idx”&“row_idx”,其中包含25行&列的数量,但我无法从我的数据中提取它们。有关如何进行的任何建议?

  2. 我想保存在csv中使用numpy.savetxt这个(25,25,20)矩阵,以便它可以被读取。我可能已经发现这个部分在stackoverflow上有些棘手,但是当我刚刚开始Python时,我并不真正了解it

我很乐意接受关于如何编码的建议。 谢谢!

回答

0

对于数字1,你可以通过指数

# generate data, and a list of row and column indices 
data = np.random.rand(77,77,20) 
col_idx = np.random.randint(0, 77, 25) 
row_idx = np.random.randint(0, 77, 25) 

# extract the subset 
subset = data[row_idx, col_idx[:, np.newaxis]] 
print(subset.shape) 
# (25, 25, 20) 

的阵列这里唯一棘手的事情是np.newaxis事情。这是NumPy的broadcasting的一个例子,这是一组规则来组合不同形状的数组。这里的形状(25,)指数阵列与形状(25, 1)指数阵列结合在一起形成(25, 25)指数网格,其中提取了原始数组的一个(25, 25, 20)子集。

就保存为CSV而言,我发现pandas库提供的工具对于这类事情最有用。对于3D数据,可以通过一个3D面板转换成数据帧,并保存到CSV直接:

import pandas as pd 
panel = pd.Panel(subset) 
frame = panel.to_frame() 
frame.to_csv('output.csv') 

这导致CSV与行/列索引为每一行中的第一和第二项。如果你想以不同的形式显示你的csv输出,你可以在保存之前使用标准的pandas索引转换(stack,unstack,reindex等)。

+0

感谢您的帮助!我不太了解“np.random.randint”部分?何时指定我想要提取的列的位置?我不想要文件中的随机列? – Jrdnalvs

+0

您没有提供您的数据,所以我生成了与您在问题中提到的类似的随机数据和行/列索引。使用您的行/列索引列表来代替。 – jakevdp

+0

它返回错误:“TypeError:元组索引必须是整数,而不是元组” – Jrdnalvs