调整numpy数组的大小而无需填充

时间:2020-09-07 19:20:41

标签: python arrays numpy resize reshape

我有一组数据,我正在使用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)),但是它从一开始就用数据填充最后一行-我需要一个解决方案,该解决方案不将任何内容放在最后一行没有数据的地方

谢谢

2 个答案:

答案 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]])

更多说明:

  • np.full((something,3), np.nan)生成一个具有np.nan值的ndarray full(当然,可以随意将np.nan替换为您认为“没什么” );
  • 然后使用numpy.r_将其附加到原始数组x
  • ,最终根据您对(-1,9)的请求reshaped

答案 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,          ,          ,