【问题标题】:How can I put an array into a matrix elements automatically in Python?如何在 Python 中自动将数组放入矩阵元素中?
【发布时间】:2021-03-03 13:56:10
【问题描述】:

我有一个大小为 30 * 30 的矩阵 X,我想将 X 自动放入数组 Y(numpy 数组)的每个单元格中。我编写了以下 Python 代码,但我不知道如何实现我想要的。更准确地说,我希望 Y 是一个大小为 99 * 1 的矩阵,其中 Y 的每个元素都是一个矩阵 X。

import numpy as np

range_var = np.arange(10,100, 1)
Y = np.zeros(np.size(range_var))

for i in range_var:
    X = np.random.rand(30,30)
    Y[i] = X

任何帮助将不胜感激!

【问题讨论】:

  • 你不应该将你的变量定义为range,因为range是python中的一个函数。
  • Y 需要是 NumPy 数组吗?有类似对象数组的东西,但 NumPy 数组是用来保存数字(不是指针)的。
  • @igorkf 是的!谢谢!
  • 不清楚你想要什么,但请注意np.ones((30)) 的形状为(30, ) 而不是(30, 30)。你的意思是X = np.ones((30, 30))
  • 对不起,我放弃了,我不明白你在问什么。你真的应该试着用更好的例子更清楚地解释自己。

标签: python arrays matlab numpy


【解决方案1】:

这有点违背使用 NumPy 的精神(因为它会使数字优势消失),但你可以这样做:

Y = np.empty(100, dtype=object)
Y[...] = [np.ones((30, 30)) for _ in range(100)]

np.ones 替换为您实际处理的任何随机函数。现在,这会产生一个数组对象的参差不齐的数组。无法确保(或以形状或类型编码)Y 的元素的形状为 (30, 30);它们也可能具有随机形状。1

对于这种情况,最好只使用list 的数组。

值得注意的是,如果您决定将Y 用作 3D 数组,则非常相似的结构也可以使用:

Y2 = np.empty((100, 30, 30))
Y2[...] = [np.ones((30, 30)) for _ in range(100)]

虽然在那种情况下你可以直接写

Y3 = np.array([np.ones((30, 30)) for _ in range(100)])

结果将自动连接。但是这两个版本都创建了不必要的数组中间列表,可以通过更多关于构造逻辑的信息来避免这些中间列表。

1正如here 所述,直接分配Ynp.arraydtype=object 相同形状的元素在设计上不起作用。

【讨论】:

    【解决方案2】:

    您可能希望执行以下操作:

    import numpy as np
    
    range_var = np.arange(10,100, 1)
    Z = np.zeros(np.size(range_var))
    Y = [[]] * len(Z)
    
    for i in range(len(Y)):
        X = np.random.rand(30,30)
        Y[i] = X
        
    print(Y[0])
    

    Y 的第一个元素的输出如下所示:

    [[8.71768142e-03 1.95842121e-01 3.48960380e-01 4.82051977e-01 2.82854636e-01 5.16650577e-01 6.99694637e-01 9.74657948e-01 1.74005728e-01 7.87224769e-01 8.45505123e-01 6.06426391e-01 6.28956958e-01 7.61095262e-01 4.83874602e-01 7.19727490e-01 1.12914684e-01 9.57578821e-01 4.15939585e-01 4.32561004e-01 5.23185891e-01 8.94867683e-01 4.03805754e-01 3.31016882e-01 6.15462553e-01 6.05025939e-01 4.93821722e-01 4.57816110e-01 2.29621863e-01 5.50679914e-01] [1.89572414e-01 3.18888371e-01 2.45477287e-01 5.84301398e-01 7.19882461e-01 3.76206859e-01 3.36516800e-01 6.62839901e-01 5.34286198e-01 6.43281618e-01 5.04704960e-01 4.11075044e-01 3.70793810e-01 2.09171377e-01 8.26894090e-01 4.88145383e-01 9.76859585e-01 5.66362393e-01 5.00326056e-02 3.03405329e-01 3.47386966e-01 3.38509244e-01 2.44756099e-01 7.26830086e-01 3.53031198e-01 5.71449664e-01 3.67615943e-01 8.77292061e-01 4.60977301e-01 2.84626276e-01] ...etc]

    【讨论】:

    • 我认为没有必要包含整个随机输出。
    【解决方案3】:

    我的评论是我要求您显示您的代码产生的错误:

    In [200]: range_var = np.arange(10,100, 1)
         ...: Y = np.zeros(np.size(range_var))
         ...: 
         ...: for i in range_var:
         ...:     X = np.random.rand(30,30)
         ...:     Y[i] = X
         ...: 
    TypeError: only size-1 arrays can be converted to Python scalars
    
    The above exception was the direct cause of the following exception:
    Traceback (most recent call last):
      File "<ipython-input-200-d3febad37a25>", line 6, in <module>
        Y[i] = X
    ValueError: setting an array element with a sequence.
    

    看看这段代码的元素:

    In [201]: Y.shape               # a 90 element array, by definition
    Out[201]: (90,)
    In [202]: Y[i]                  # one element of this array
    Out[202]: 0.0
    In [203]: X                     # a (30,30) shaped array
    Out[203]: 
    array([[0.7509964 , 0.5079236 , 0.21115   , 0.01971662, 0.89276404,
    ....
    

    它说你不能将许多项目(序列)放入一个只接受一个数字的插槽中。

    一个答案建议将Y 创建为对象dtype,然后它可以接受数组作为元素。但是一个对象 dtype 数组只是一个美化(或私下化)的列表。

    如果所有X 的大小相同,您可以创建一个接受这些子数组的 3d 数组。

    Y = np.zeros((N,30,30))
    

    如果X 的形状不同,那么你必须走object 路线,但我仍然认为列表更好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-12
      • 1970-01-01
      • 2017-12-12
      相关资源
      最近更新 更多