只能将大小为1的数组错误转换为Python标量

时间:2018-08-29 22:33:56

标签: python arrays

我有此代码:

for a in data_X:
    for i in a:
        if not i.isdigit():
            x=hash(i)
            data_X[column,row]=x
        row=row+1
    row=0
    column=column+1


desired_array = [int(numeric_string) for numeric_string in data_X]

和我的Data_X是这些(仅是数组的一部分):

[['42' '-6725209669690155188' '159449' ... '40' '4017763880221344027'
  '-136014339944321305']
 ...
 ['30' '-6725209669690155188' '154950' ... '60' '4017763880221344027'
  '-136014339944321305']]

,我想将数字从char(例如'42')转换为int(42),我可以这样做:desired_array = [int(numeric_string) for numeric_string in data_X] 但是我收到错误消息“只有错误的size-1数组可以转换为Python标量”,我不知道该怎么办。

这些就是我想要的:来自:

[['42' '-6725209669690155188' '159449' ... '40' '4017763880221344027'
  '-136014339944321305']
 ...
 ['30' '-6725209669690155188' '154950' ... '60' '4017763880221344027'
  '-136014339944321305']]

收件人:

[[42 -6725209669690155188 159449 ... 40 4017763880221344027
  -136014339944321305]
 ...
 [30 -6725209669690155188 154950 ... 60 4017763880221344027
  -136014339944321305]]

有人可以告诉我问题出在哪里吗

谢谢!

1 个答案:

答案 0 :(得分:0)

您正尝试使用列表理解来创建新列表,如下所示:

 desired_array = [int(numeric_string) for numeric_string in data_X]

由于data_X是2D数组,因此,只要有许多列(至少7列),每个numeric_string都是1D数组。 (实际上,您将其命名为numeric_string并不是一个字符串。)您不能为此调用int,这正是错误消息显示的原因。

如果不清楚,则应尝试打印出值:

for numeric_string in data_X:
    print(numeric_string)

…,应该很清楚numeric_string不是数字字符串。


可以使用嵌套循环修复此问题。如果您不太了解这些理解,请首先使用显式循环语句编写它:

desired_array = []
for row in data_X:
    desired_row = []
    for col in row:
        desired_row.append(int(col))
    desired_array.append(desired_row)

…,然后在确定了解之后就可以将其转变为理解力:

desired_array = [int(numeric_string) for numeric_string in row] for row in data_X]

但是,这仍然不能为您提供2D整数数组,而是为您提供了一个整数列表列表。它与类似,但是它更大且更慢,并且您不能在其上调用numpy方法。 (至少,您仍然可以将其传递给全局numpy函数。)

如果您想通过循环创建2D数组,则可以这样做。

但是与numpy一样,如果可能的话,您要执行的操作是使用向量化运算而不是循环。这样既简单又快捷,没有任何实际缺点。

您可能想要的是astype

desired_array = data_X.astype(np.int64)

很难比这更简单。而且,除非您想要一个包含Python dtype=object值的int数组(例如,因为您的某些数字太大而无法放入本机int64中),否则这正是您想要的。