如何生成不同大小的numpy数组(例如对象),然后对其应用数学运算

vktxenjb  于 2023-04-21  发布在  其他
关注(0)|答案(2)|浏览(78)

我试图通过平方和来进行最小化,但我正在进行的全局最小化具有不同大小的数组。我试图使用所有数据集进行最小化,即使它们的大小不同。

data_1=[[1,2],[2,3]]
data_2=[[3,4],[5,6],[6,7]]
model_1=[[1,1],[2,2]]
model_2=[[3,3],[5,5],[6,6]]

现在数据/模型的大小相同,所以这样做

sum((data_1-model_1)**2)

问题是我试图把所有的数据和所有的模型结合起来,以实现全局拟合。

total_data=[[[1,2],[2,3]],[[3,4],[5,6],[6,7]]]
total_model=[[[1,1],[2,2]],[[3,3],[5,5],[6,6]]]

现在你可以像这样创建列表的列表,但是我想创建一个numpy数组,这样我就可以进行数学运算,比如

np.sum((total_data-total_model)**2)

您可以创建numpy对象,但它们被处理为列表,因此数学numpy操作不适用于列表对象。
任何关于如何做到这一点的建议都将非常感谢!我只是试图整合我的数据并进行全局拟合,而不是制作多个嵌套循环并单独处理每个循环。

htzpubme

htzpubme1#

不同大小的矩阵的减法是不同的操作,这是没有办法的。你可以使用各种numpy和Python魔法来使它看起来像一个操作,但在一天结束时,类似于

data_list = [...]  # List of numpy arrays
model_list = [...]  # same, with corresponding sizes

error = 0
for data, model in zip(data_list, model_list):
   error += np.sum((data-model)**2)

将是最明显和清晰的。
如果这成为性能瓶颈,您可以使用numba

3zwjbxry

3zwjbxry2#

我们可以对对象dtype数组做一些数学运算,但不是所有的运算。而且,当它工作时,数学运算是以列表理解的速度完成的,而不是以数字dtype的编译速度完成的。
制作阵列列表:

In [20]: datalist= [np.array(data_1),np.array(data_2)]
    ...: modlist = [np.array(model_1),np.array(model_2)]

然后直接将你的计算应用于这些对:

In [21]: [np.sum((data-model)**2) for data, model in zip(datalist, modlist)]
Out[21]: [2, 3]

现在尝试从这些列表中创建对象dtype数组:

In [22]: A=np.array(datalist,object); B=np.array(modlist,object)    
In [23]: A
Out[23]: 
array([array([[1, 2],
              [2, 3]]), 
       array([[3, 4],
              [5, 6],
              [6, 7]])], dtype=object)

请注意这与从列表列表中创建数组的不同之处:

In [24]: np.array(total_data,object)
Out[24]: 
array([list([[1, 2], [2, 3]]), list([[3, 4], [5, 6], [6, 7]])],
      dtype=object)

像+/* 这样的运算符通常与对象dtype列表一起使用,前提是元素也实现了它们:

In [25]: C=(A-B)**2    
In [26]: C
Out[26]: 
array([array([[0, 1],
              [0, 1]]), array([[0, 1],
                               [0, 1],
                               [0, 1]])], dtype=object)

列表数组不能做到这一点,因为列表不能实现大多数运算符。
我们不能将sum函数应用于该数组:

In [27]: np.sum(C)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[27], line 1
----> 1 np.sum(C)

File <__array_function__ internals>:200, in sum(*args, **kwargs)

File ~\miniconda3\lib\site-packages\numpy\core\fromnumeric.py:2324, in sum(a, axis, dtype, out, keepdims, initial, where)
   2321         return out
   2322     return res
-> 2324 return _wrapreduction(a, np.add, 'sum', axis, dtype, out, keepdims=keepdims,
   2325                       initial=initial, where=where)

File ~\miniconda3\lib\site-packages\numpy\core\fromnumeric.py:86, in _wrapreduction(obj, ufunc, method, axis, dtype, out, **kwargs)
     83         else:
     84             return reduction(axis=axis, out=out, **passkwargs)
---> 86 return ufunc.reduce(obj, axis, dtype, out, **passkwargs)

ValueError: operands could not be broadcast together with shapes (2,2) (3,2)

对于像logsin这样的函数也是如此。
但是我们可以求助于显式的列表解析:

In [28]: [np.sum(x) for x in C]
Out[28]: [2, 3]

相关问题