从数据数组创建自定义对象的numpy数组的最佳方法?

jm2pwxwz  于 2023-04-12  发布在  其他
关注(0)|答案(2)|浏览(106)

假设你有一个Python类,它封装了一些数据:

import numpy
from dataclasses import dataclass

@dataclass
class A:
    a: float
    b: float

我们可以创建一个A的示例,它包含数组而不是简单的浮点数:

a_vals = numpy.linspace(0, 1)
b_vals = numpy.linspace(0, 1)

ma, mb = numpy.meshgrid(a_vals, b_vals, indexing="ij")

# Now the instance
a_instance = A(ma, mb)

或者,可以创建A示例的数组

a_instances = numpy.empty((50, 50), dtype=object)
for i in range(50):
    for j in range(50):
        a_instances[i, j] = A(a_vals[i], b_vals[j])

但这似乎要麻烦得多,因为涉及到实际的循环。有没有更好的方法来创建a_valsb_vals(或它们的meshgrid)上的A示例数组?numpy打算用什么方法来实现这一点?

jmo0nnb3

jmo0nnb31#

我要提醒的是,“intended by numpy”倾向于避免使用dtype=object,而是使用(X, Y, 2)形状的数组。
如果你确实想得到一个A对象的形状(X, Y)数组,那么np.vectorizebroadcasting可以工作:

import numpy as np
from dataclasses import dataclass

@dataclass
class A:
    a: float
    b: float

a_vals = np.arange(3)
b_vals = np.arange(3)

out = np.vectorize(A)(a_vals[:, None], b_vals[None, :])

输出:

array([[A(a=0, b=0), A(a=0, b=1), A(a=0, b=2)],
       [A(a=1, b=0), A(a=1, b=1), A(a=1, b=2)],
       [A(a=2, b=0), A(a=2, b=1), A(a=2, b=2)]], dtype=object)
r1zk6ea1

r1zk6ea12#

你可以使用numpy.vectorize函数在a_vals和B_vals上创建一个类A的示例数组。这个函数接受一个Python函数作为输入,并返回一个可以对NumPy数组进行操作的新函数。下面是一个例子:

import numpy as np
from dataclasses import dataclass

@dataclass
class A:
    a: float
    b: float

a_vals = np.linspace(0, 1)
b_vals = np.linspace(0, 1)

ma, mb = np.meshgrid(a_vals, b_vals, indexing="ij")

def create_instance(a, b):
    return A(a, b)

create_instance_vectorized = np.vectorize(create_instance)

a_instances = create_instance_vectorized(ma, mb)

# Print the resulting array of instances
print(a_instances)

这将创建类A示例的2D数组,其中a和B属性的值取自a_vals和b_vals的网格

相关问题