反向扁平numpy数组?

时间:2017-05-30 16:31:12

标签: python arrays numpy

我有一个数组

[[0, 1, 0, 0] [0, 1, 0, 0] [1, 0, 0, 0] ..., [0, 1, 0, 0] [0, 1, 0, 0] [1, 0, 0, 0]] 形状(38485,) 我想重塑为(38485,4)喜欢

[[0, 1, 0, 0] 
[0, 1, 0, 0] 
[1, 0, 0, 0]
.
.
.
[0, 1, 0, 0]
[0, 1, 0, 0]
[1, 0, 0, 0]]

但是当我尝试array.reshape(-1,4)时,它会抛出错误ValueError: cannot reshape array of size 38485 into shape (4)

获取数组的代码:

dataset = pd.read_csv('train.csv')

y = dataset.iloc[:, 6]

fr=np.array([1,0,0,0])
re=np.array([0,1,0,0])
le=np.array([0,0,1,0])
ri=np.array([0,0,0,1])
for i in range(y.shape[0]):
    if y[i]=="Front":
        y[i]=fr
    elif y[i]=="Rear":
        y[i]=re
    elif y[i]=="Left":
        y[i]=le
    elif y[i]=="Right":
        y[i]=ri

array=y.values

我有什么方法可以做到这一点吗?

我通过

解决了这个问题

array = np.array([[n for n in row] for row in array])

感谢wim

2 个答案:

答案 0 :(得分:2)

更新回答:

变量y是一个包含字符串和numpy.array的numpy数组。它的dtypeobject,所以numpy并不理解它是一张桌子,即使它在结尾处充满了4个元素numpy.array。预处理。

您可以使用除y之外的其他变量或使用以下内容转换y.values来避免混合对象类型:

array = np.array([x.astype('int32') for x in y.values])

举个例子:

import numpy as np
y = np.array(["left", "right"], dtype = "object")
y[0] = np.array([1,0])
y[1] = np.array([0,1])
print(y)
# [[1 0] [0 1]]
print(y.dtype)
# object
print(y.shape)
# (2,)
y = np.array([x.astype('int32') for x in y])
print(y)
# [[1 0]
#  [0 1]]
print(y.dtype)
# int32
print(y.shape)
# (2, 2)

原始答案:

你的array不完整。它有38485个元素,其中许多看起来像4元素数组。但是在中间的某个地方,必须至少有一个内部阵列没有4个元素。或者,您可能会混合使用各种广告系列(listarray)。

这可能就是为什么第二个值没有在形状中定义。

这是一个带有一个(8, 4)数组及其副本的示例,只丢失了一个元素:

import numpy as np

data = np.array([[0, 1, 0, 0],[0, 1, 0, 0],[1, 0, 0, 0] , [0, 1, 0, 0], [0, 1, 0, 0], [0, 1, 0, 0], [0, 1, 0, 0],[1, 0, 0, 0]])
print(data.shape)
# (8, 4)
print(data.dtype)
# int64
print(set(len(sub_array) for sub_array in data))
# set([4])
print(data.reshape(-1, 4))
# [[0 1 0 0]
#  [0 1 0 0]
#  [1 0 0 0]
#  [0 1 0 0]
#  [0 1 0 0]
#  [0 1 0 0]
#  [0 1 0 0]
#  [1 0 0 0]]

broken_data = np.array([[0, 1, 0, 0],[0, 1, 0, 0],[1, 0, 0, 0] , [1, 0, 0], [0, 1, 0, 0], [0, 1, 0, 0], [0, 1, 0, 0],[1, 0, 0, 0]])
print(broken_data.shape)
# (8, )
print(broken_data.dtype)
# object
print(set(len(sub_array) for sub_array in broken_data))
# set([3, 4])
print(broken_data.reshape(-1, 4))
# [[[0, 1, 0, 0] [0, 1, 0, 0] [1, 0, 0, 0] [1, 0, 0]]
#  [[0, 1, 0, 0] [0, 1, 0, 0] [0, 1, 0, 0] [1, 0, 0, 0]]]
print([sub_array for sub_array in broken_data if len(sub_array) != 4])
# [[1, 0, 0]]

找到不具有4个元素的子阵列,并将其过滤掉或修改它们。

然后您将拥有(38485,4)数组,并且您不必致电reshape

答案 1 :(得分:1)

数组长度必须是4的倍数.38485不是4的倍数。否则,重写文件应该正常工作:

array.reshape(-1,4)