使用占位符将数组调整为不可能的形状

时间:2018-07-13 15:16:22

标签: python python-3.x numpy

我正在重组一个数组,以解决前端对象按此顺序显示的前端问题。

'a' 'd' 'g'
'b' 'e' 'h'
'c' 'f' 'i'

何时显示为

'a' 'b' 'c'
'd' 'e' 'f'
'g' 'h' 'i'

我通过使用以下代码解决了这个问题:

results = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
results = np.array(results).reshape(int(len(results) / 3), 3).T.ravel().tolist()

我现在遇到的问题是,当给我一个长度不能被3整除的数据数组时,例如

['a']

我明白了

  

ValueError:无法将大小为1的数组重塑为形状(0,3)

最好的方法是用占位符填充它,然后在调整大小后删除那些占位符吗?或者numpy中有内置功能来处理这些类型的Scenerios?同样在我的实际代码中,数组中填充的是对象而不是单个字母,因此我不太确定占位符的最佳做法是什么。

2 个答案:

答案 0 :(得分:2)

在重新整形之前如何将结果大小填充到3的最接近倍数 然后,您可以在转换回列表后过滤空值

>>> results = ['a']
>>> l = len(results)
>>> n = int(l/3)+1 if l%3 else int(l/3)
>>> np.pad(np.array(results), ((0,n*3-l)), mode='constant').reshape((n,3), order='F')
array([['a', '', '']], dtype='<U1')

答案 1 :(得分:0)

基于对Sunitha答案的一些修改(我需要它保留一个1d数组并支持对象作为元素),这就是我最终的目的

l = len(results)
if(l>0):
    n = int(l/3)+1 if l%3 else int(l/3)
    results = np.array(list(filter((0).__ne__,np.pad(np.array(results), ((0,n*3-l)), mode='constant').reshape((n,3), order='F').flatten())),dtype=object)