反转扁平化的numpy数组?

3
我有一个数组: [[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


set(len(sub_array) for sub_array in array) 返回什么? - Eric Duminil
“reshape” 无法改变元素的总数。38485*4比原始值38485大。但是您的数组的“dtype”是什么?整数还是对象? - hpaulj
2个回答

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 个元素。或者你可能混合了集合 (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
我的代码 print(set(len(sub_array) for sub_array in broken_data)) 输出 {4},我确定内部列表中没有缺失值。 print([sub_array for sub_array in broken_data if len(sub_array) != 4]) 输出 [],这证明我没有损坏的数组。 - Vijayabhaskar J
它打印出 {<class 'numpy.ndarray'>}。 - Vijayabhaskar J
不确定,我以前从未遇到过这个问题。array.astype('int32') - Eric Duminil
@VijayabhaskarJ:请将此信息添加到问题中。Python在注释中看起来不好 :) - Eric Duminil
您可以现在访问该链接,我正在编辑我的问题时遇到了困难。 - Vijayabhaskar J
显示剩余8条评论

1
数组的长度必须是4的倍数。38485不是4的倍数。否则,您编写的重塑操作应该可以正确执行:
array.reshape(-1,4)

我试图从数组中删除一个元素,以便在使用array.reshape(-1,4)进行重塑后大小为(38484,)。我得到了(9621, 4),但我需要(38484,4)。当我打印数组时,我得到所有元素都在同一行上,但我需要它们一个接一个地排列,就像我在问题中提到的那样。我确信每个内部数组都有4个元素。 - Vijayabhaskar J
array.dtype 是什么? - wim
@wim 我会赌在 object 上。 - Eric Duminil
尝试使用以下代码:array = np.array([[n for n in row] for row in array]),看看是否解决了你的问题。 - wim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接