我有此代码:
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]]
有人可以告诉我问题出在哪里吗
谢谢!
答案 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中),否则这正是您想要的。