我使用了一个map
函数,其中返回的迭代器指向的每个元素都是一个numpy
数组,即
result = list(map(func, values))
print(result[:2]))
[array([0.981, 0.23]), array([1.231, -0.56])]
我希望结果是一个唯一的numpy
数组,即
print(result[:2])
array([[0.981, 0.23],[1.231, -0.56]])
我尝试使用result = np.fromiter(map(func, values))
,但收到以下弃用警告:
DeprecationWarning: Conversion of
an array with ndim > 0 to a scalar is deprecated, and will error in future. Ensure you extract a single
element from your array before performing this operation. (Deprecated NumPy 1.25.)
如何解决这个问题?
编辑:虽然我有很好的答案,但我想直接从map
返回的迭代器转换为np.array,从而跳过从迭代器到可迭代对象的转换。
编辑2:这里是一个最小的工作示例
def func(u):
# The size of A,B,C,D may change, so it is good idea to keep the function as general as possible
A = np.array([[-1, 0], [-0.2, 1]]).reshape(2, 2)
B = np.array([1, 0]).reshape(2, 1)
C = np.array([[1, 0], [0, 1]]).reshape(2, 2)
D = np.array([1, 1]).reshape(2, 1)
xx = A @ xx + B @ u
return C @ xx + D @ u
N = 100
values = np.ones(N).reshape(N, 1)
result = np.array(list(map(func, values)))
3条答案
按热度按时间6kkfgxo01#
您可以通过以下方式更改您的值:
或
或
也可以使用列表解析代替
list,map
这取决于您的
func
和values
。例如:tkqqtvp12#
使用
np.array(list(map(func,values)))
是一个很好的通用调用,尽管我通常更喜欢np.array([func(i) for i in values])
。在任何情况下,np.array
都会得到一个列表参数,它可以分析并确定正确的dtype和shape。它创建一个目标数组,并使用任何必要的转换填充值。如果列表在某种程度上是“不规则的”,有时会产生一个
object
dtype数组,现在会产生一个关于非均匀输入的模糊错误。fromiter
应该在1d输入的情况下使用defineddtype
来简化这一点。它不必查看整个列表来识别最佳dtype
;你就这么跟它说用count
,它可以用np.empty(count, dtype)
生成数组。如果没有count
,它会进行猜测,并再执行一次resize
方法调用来调整目标。您正在突破
fromiter
使用方式的文档边界。与range interable误用:
正确使用dtype:
或者使用理解生成器:
尝试返回数组,但将dtype保留为标量
int
:利用最新的补丁,允许对象dtype:
或者使用少量文档化的子数组dtype:
注意,只有当我们可以指定
dtype
的一部分作为可迭代对象返回的数组的长度时,这才有效。将其转换为可Map函数:
给定一个数组列表,
np.array
尝试默认创建一个多维数字dtype数组:我们可以通过
frompyfunc
和vectorize
来获得对象dtype数组:编辑
注意不要对
fromiter
和generators/map的性能改进寄予太多希望。这些仍然涉及python级别的迭代。我们的
foo
可以在“纯”numpy中完成广播,如:(尽管对于这种小尺寸,迭代可能仍然更快。)
你的
func
和@
可以在没有迭代的情况下表达,使用matmul
中3d+数组的batch
行为。但那是另一个主题了。watbbzwu3#
执行
示出
关于fromiter的Numpy手册