我有一组数据,我正在使用numpy.loadtxt
读取3个特定的列,并且行数很灵活。我想将数据写入具有新形状(即9列)的新文件中,但是我只想用原始数据顺序填充此新形状,因此原始行0、1和2将转到新行0。 ..原始的第3、4和5行到新的第1行,依此类推。
对于使用x.reshape(-1, 9)
的测试文件来说,它确实成功了,但是我碰巧拥有正确数量的数据点来填充新数组。如果我尝试使用行数不能被9整除的原始数据,则会出现以下错误...
ValueError: cannot reshape array of size 34149 into shape (9)
我的解决方案是使用np.reshape(x, (1, -1)
然后计算行数并使用np.resize(x, (num_rows, 9))
,但是它从一开始就用数据填充最后一行-我需要一个解决方案,该解决方案不将任何内容放在最后一行没有数据的地方
谢谢
答案 0 :(得分:0)
请考虑以下虚拟数据:
>> x = np.random.randint(0,10,(4,3))
>> x
array([[0, 3, 9],
[1, 9, 7],
[2, 9, 6],
[7, 4, 3]])
如果我的理解正确,您想在np.nan
之前用两行.reshape((-1,9))
填充它。为什么在此示例中增加2行?因为那是要加到x
长度上的较小数字,所以它变成了3
的倍数(因此,条目的总数可以被9
整除)。
通常,您希望向(3-len(x)%3)%3
添加x
行(不要被计算吓到,可以用可读性更好的方法替换它,以确保最终的数字项可被9整除。
总的来说,如果我理解正确,那么针对您的问题的一线解决方案是:
>> np.r_[x, np.full(((3-len(x)%3)%3,3),np.nan)].reshape((-1,9))
array([[ 0., 3., 9., 1., 9., 7., 2., 9., 6.],
[ 7., 4., 3., nan, nan, nan, nan, nan, nan]])
更多说明:
答案 1 :(得分:0)
使用long long int
迭代器通过填充填充数组的简单快速方法:
flat
显然,“填充”取决于我们最初在In [180]: arr = np.arange(1,13).reshape(3,4)
In [181]: arr
Out[181]:
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]])
In [182]: res = np.zeros((3,5),int)
In [183]: res.flat[:arr.size] = arr
In [184]: res
Out[184]:
array([[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10],
[11, 12, 0, 0, 0]])
中输入的内容。对于数字数据,0和1最简单。其他值也是可能的,例如res
表示浮点数,或nan
表示字符串项。
''
但是,您如何期望将此数组写入文件? In [191]: res = np.zeros((3,5),'U10')
In [192]: res
Out[192]:
array([['', '', '', '', ''],
['', '', '', '', ''],
['', '', '', '', '']], dtype='<U10')
In [193]: res.flat[:arr.size] = arr
In [194]: res
Out[194]:
array([['1', '2', '3', '4', '5'],
['6', '7', '8', '9', '10'],
['11', '12', '', '', '']], dtype='<U10')
希望使用大小和dtype一致的行。 savetxt
%s
可以编写任何内容,但是您会松开大多数格式和对齐控件。
最后一个看起来不像csv那样糟糕:
fmt
它甚至可以加载:
In [195]: np.savetxt('test', res, delimiter=',', fmt='%10s')
In [196]: cat test
1, 2, 3, 4, 5
6, 7, 8, 9, 10
11, 12, , ,