【问题标题】:How do i add an np.array to an existing np.array without merging the two?如何在不合并两者的情况下将 np.array 添加到现有的 np.array 中?
【发布时间】:2022-01-06 11:10:18
【问题描述】:

我正在用 Python 制作一个玩井字游戏的极小极大算法。我需要将所有可能的 ndarray 组合存储在不同的 ndarray 中。我将板存储在一个 numpy 数组中,所以空板将是[[0,0,0],[0,0,0],[0,0,0]],X 是 1,O 是 -1。我想这样做:首先,我有一个np.array([]),我在其中添加了下一步可能发生的所有状态,因此对于棋盘上的第一步,它看起来像[[[1,0,0],[0,0,0],[0,0,0]],[[0,1,0],[0,0,0],[0,0,0]],[...]]。我尝试了 np.append 和 np.concatenate,但我无法让它按我的意愿工作。我该怎么办?

【问题讨论】:

  • 你是怎么尝试的?请显示一些代码!
  • 为什么需要将组合数组存储在数组中?为什么不是清单?如果是数组,你想要什么形状的数组?你会用它做什么?你是如何产生“所有状态”的?这么多问题,这么少的信息!还有一件事,“不合并”是什么意思?

标签: python arrays numpy


【解决方案1】:

您需要的唯一技巧是广播以生成附加维度以进行堆栈。 (这里我用这个额外的维度创建了第一个状态条件,但是你可以在 stackin 之前广播它

这里有一个可能的解决方案:

import numpy as np


states = np.random.randn(1,3,3)
print(f"actual Shape is: {states.shape}")

for i in range(3):
    newState = np.random.randn(3,3)
    states = np.append(states,newState[None,:,:],axis=0)
    print(f"actual Shape is: {states.shape}")

您也可以使用vstackconcatenate

states = np.vstack([states,newState[None,:,:]])

states = np.concatenate([states,newState[None,:,:]],axis=0)

【讨论】:

    【解决方案2】:

    这可以通过np.append 完成。附加 numpy 数组时,数组应具有相同的维数。因此,为了获得您想要的结果,您可以这样进行:

    import numpy as np
    
    tictactoe = np.zeros(shape=(1, 3, 3)) # create an empty array
    n = np.array([[[0, 0, 0], [0, 1, 0], [0, 1, 0]]]) # example of value to add
    
    tictactoe = np.append(tictactoe, n, axis=0) # adding the value in
    print(tictactoe)
    

    为了使np.append 工作,请注意我将其中一个板作为三维数组[[[0, 0, 0], [0, 1, 0], [0, 1, 0]]] 传递到第一个轴axis=0。注意三重括号。这应该会给你一个形状为(2, 3, 3) 的结果,其中2 代表你拥有的板数。

    否则,这是一种无需 numpy 的基本方法,只需附加一个列表:

    tictactoe = []
    n = [[0, 0, 0], [0, 1, 0], [0, 1, 0]]
    tictactoe.append(n)
    print(tictactoe)
    

    注意正如 cmets 中的 @hpaulj 所指出的,带有轴的 np.appendnp.concatenate 相同。这种迭代使用可能非常缓慢,并且在开始时需要特别小心。 Here is a link to a related issue.

    【讨论】:

    • np.appendaxis 只是对 np.concatenate 的调用。 concatenate(和家庭)最好与整个数组列表一起使用。像这样的迭代使用要慢得多,并且在开始时需要特别小心。请参阅最近的 SO,stackoverflow.com/questions/70144878/… 关于速度。
    • @hpaulj 确实如此,但我确实认为这是一个重要的选择。 np.append 更容易理解/掌握。此外,鉴于@ubi 提到了np.appendnp.concatenate,尽管应该显示每个选项。总而言之,您是对的,它们完全相同,并且在启动时都需要特别小心。感谢您的链接
    • 我从许多 SO 中观察到,np.append 更容易被误解。它鼓励从列表追加复制的迭代使用。它不是列表追加克隆。
    • 我会将您的评论添加到答案中
    • @hpaulj 我对 for 的回答是这样制定的,因为 OP 没有提供有关他/她如何尝试连接的更多信息……然后我放了一些示例代码……是的关于追加,这就是我提出其他选项的原因,但认为追加是使代码清晰的好方法,连接似乎让某些人感到困惑
    猜你喜欢
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    相关资源
    最近更新 更多