【问题标题】:append large number to numpy array将大数附加到numpy数组
【发布时间】:2020-01-10 05:13:25
【问题描述】:

我有一个 Row=12584 和 Col 784 的 Xmatrix。我想根据 Row=12584 Col 1 的另一个 Tmatrix 提取每一行,并将值附加到 numpy 数组 X1 或 X2。即使较小的行大小为 1500,也需要 10 分钟以上。我确信有更好、更有效的方法来提取整行并附加到数组

import numpy as np
import time
start_time = time.time()

Row = 12584
#Row = 1500
Col = 784
Xmatrix = np.random.rand(Row,Col)

Tmatrix = np.random.randint(1,3,(Row,1))
X1 = np.array([])
X2 = np.array([])

for i in range(Row):
    if Tmatrix[i] == 1:
        for y in range(Col):
            print ('Current row and col are --', i, y, Xmatrix[i][y])
            X1 = np.append(X1, Xmatrix[i][y])
    else:
        for y in range(Col):
            X2 = np.append(X2, Xmatrix[i][y])

print (X1)
print("--- %s seconds ---" % (time.time() - start_time))

【问题讨论】:

  • alist.append(Xmatrix[i,y]) 应该更快。但无论哪种方式,对行和列的迭代都很慢。即使您在 Row 上进行迭代并进行测试,您也不需要在 Col 上进行迭代,alist.extend(Xmatrix[i] 一次将整行放入列表中。
  • @hpaulj - 您对使用列表进行扩展的建议正在制定中 - 如果您可以将其发布为答案,我可以继续选择它。

标签: python numpy append


【解决方案1】:

试试这个:

import numpy as np
import time
start_time = time.time()

Row = 12584
#Row = 1500
Col = 784
Xmatrix = np.random.rand(Row,Col)

Tmatrix = np.random.randint(1,3,(Row,1))

X1 = Xmatrix[(Tmatrix==1).reshape(-1)]
X2 = Xmatrix[(Tmatrix==2).reshape(-1)]

print(X1.reshape(-1))

print(time.time() - start_time)

在我的电脑上,程序运行时间为 0.34 秒。 使用 numpy 时,最好通过索引和切片来避免循环 http://codeinpython.com/tutorials/numpy-array-indexing-slicing/

【讨论】:

  • 你能解释一下“X1 = Xmatrix[(Tmatrix==1).reshape(-1)]”它是做什么的......我猜对我来说太 Pythonic了
  • 我将解释 "X1 = Xmatrix[(Tmatrix==1).reshape(-1)]" "reshape(-1)" 将数组展平为一维数组 "Xmatrix[Bool_Array ]" 返回行,其中 Bool_Array 为 True。见stackoverflow.com/questions/7994394/…docs.scipy.org/doc/numpy/user/…
【解决方案2】:

您可以通过列 for y in range(Col): 删除迭代,在 numpy 中您可以通过以下方式检索整行:

Xmatrix[i, :]

然后追加

X1=np.append(X1, [Xmatrix[i, :]], axis=0)

或者:

X1=np.vstack([X1, Xmatrix[i, :]])

编辑

要进行附加工作 - 首先您需要以正确的形状参数创建 X1 和 X2。在这种情况下:

X1=np.empty(shape=(0, Col))
X2=np.empty(shape=(0, Col))

【讨论】:

  • 附加错误 - “ValueError:所有输入数组必须具有相同的维数,但索引 0 处的数组有 1 个维度,索引 1 处的数组有 2 个维度)" 和 vstack 出现错误 "ValueError: 连接轴的所有输入数组维度必须完全匹配,但沿维度 1,索引 0 处的数组大小为 0,索引 1 处的数组大小为 784
  • 小调整 - 您需要以预定义的形状创建 X1 和 X2 - 请参阅我的答案中的编辑。
  • 仍然低于错误 - “ValueError:连接轴的所有输入数组维度必须完全匹配,但沿维度 1,索引 0 处的数组大小为 12584,索引 1 处的数组大小第784章
  • 对不起!现在它应该可以工作了 - 我使用行数来创建空列表,而不是列数......
【解决方案3】:

使用列表,这应该是相当有效的:

X1 =[]
X2 =[]    
for i in range(Row):
    if Tmatrix[i] == 1:
        X1.extend(Xmatrix[i])
    else:
        X2.extend(Xmatrix[i])

如果需要,您可以在之后np.array(X1)

【讨论】:

  • @hpaulji - 你的解决方案对我来说是最直观的,但我认为选择的答案是最好的方法。感谢您的帮助:)
猜你喜欢
  • 1970-01-01
  • 2018-07-15
  • 2017-05-22
  • 2021-02-21
  • 2021-10-25
  • 2020-03-13
  • 2017-08-18
  • 1970-01-01
  • 2017-05-09
相关资源
最近更新 更多