我有一个数组
[[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
答案 0 :(得分:2)
变量y
是一个包含字符串和numpy.array
的numpy数组。它的dtype
是object
,所以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个元素。或者,您可能会混合使用各种广告系列(list
,array
)。
这可能就是为什么第二个值没有在形状中定义。
这是一个带有一个(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)