gpt4 book ai didi

python - np.fromfunction : Reference other arrays

转载 作者:太空宇宙 更新时间:2023-11-04 03:12:37 24 4
gpt4 key购买 nike

我正在尝试根据一个数组中的值是否在另一个数组中来创建一个数组。我希望以下内容会起作用:

A = np.fromfunction(lambda x, y: tuple(order[x,:]) in paths[y,],\
shape=((len(order), len(paths))), dtype=int)

不幸的是,这只会产生一个标量值,而不是我想要的数组。我可以使用 for 循环实现相同的效果,如下所示,但由于涉及的值数量众多,此选项非常慢。

A = np.zeros(shape=(len(order), len(paths)), dtype=int)
for i in np.ndindex(len(order), len(paths)):
r = i[0] # Row
c = i[1] # Column
x = r + c + (len(paths)-1)*r
if paths[c,] == None:
pass
elif tuple(order[r,:]) in paths[c,]:
np.put(A, x, 1, 'wrap')

有没有人有生成目标矩阵的有效方法?非常感谢您的帮助!

\edit:非常感谢 hpaulj 的提示。我认为np.where 进入了我想要实现的方向,但是无法处理两个数组的复杂性。我编辑了上面的方法,因为 x = r*c if r*c != 0 else r+c 没有给我我想要的结果——当我的输出是乱码时,我以某种方式弄清楚了... 但是,x = r + c + (len(paths)-1)*r 确实可以唯一标识平展二维数组的每个位置。我在下面包含了一些示例,这些示例应该可以更清楚地说明我要实现的目标。抱歉造成混淆!

order
[[ 73 6 3 1]
[ 73 6 3 2]
[ 6 116 3 1]
[ 6 116 3 2]
[116 45 3 1]
...10k additional lines...]

paths
[ [(12, 14, 1615, 1), (14, 156, 1615, 1), (156, 83, 1615, 1), (83, 37, 1554, 1), (37, 36, 1554, 1)]
[(12, 14, 1615, 2), (14, 156, 1615, 2), (156, 83, 1615, 2), (83, 37, 1554, 2), (37, 36, 1554, 2)]
[(12, 14, 1615, 1), (14, 156, 1615, 1), (156, 83, 1615, 1), (83, 37, 1554, 1), (37, 36, 1554, 1)]
[(12, 14, 1615, 2), (14, 156, 1615, 2), (156, 83, 1615, 2), (83, 37, 1554, 2), (37, 36, 1554, 2)]
[(12, 14, 1615, 1), (14, 156, 1615, 1), (156, 83, 1615, 1), (83, 37, 1554, 1), (37, 36, 1554, 1)]
[(12, 14, 1615, 2), (14, 156, 1615, 2), (156, 83, 1615, 2), (83, 37, 1554, 2), (37, 36, 1554, 2)]
...600 additional lines...]

目标是检查 order 的每个值是否在 paths 内,并且是否为 True1 在行/列交叉点。所有其他交叉点应为 False/0。保持行和列的顺序至关重要,因为矩阵随后会与有序向量相乘。实际上,我正在模拟这个(URL - 见下文,p94)算法。该矩阵应该反射(reflect)特定产品(路径)对特定资源(order)的利用。

网址:https://books.google.com/books?id=GhdDbEM-_5oC&lpg=PA100&ots=wH5OVDz7JV&dq=dlp%20revenue%20management&pg=PA94#v=onepage&q&f=false

最佳答案

查看代码形式fromfunction

args = indices(shape, dtype=dtype)
return function(*args,**kwargs)

np.indices 类似于 meshgrid

In [28]: np.indices((2,3))
Out[28]:
array([[[0, 0, 0],
[1, 1, 1]],

[[0, 1, 2],
[0, 1, 2]]])

所以 np.fromfunction(lambda i, j: i + j, (3, 3), dtype=int) 相当于做

In [29]: idn=np.indices((2,3))
In [31]: idn[0]+idn[1]
Out[31]:
array([[0, 1, 2],
[1, 2, 3]])

我通常会用广播来做:np.arange(2)[:,None] + np.arange(3)

有一个 np.frompyfunc 将把一个 Python 函数应用到它输入的每个元素。但它只适用于 1d(尽管对于结构化数组有一些巧妙的技巧)。 np.vectorize 也使用了它。但两者仍在迭代,因此最多节省 2 倍的时间。

===============

ndindex 是另一种生成索引值的方式

In [42]: list(np.ndindex(2,3))
Out[42]: [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2)]

In [43]: list(zip(*np.ndindex(2,3)))
Out[43]: [(0, 0, 0, 1, 1, 1), (0, 1, 2, 0, 1, 2)]

通过 zip 转置,我得到的值与 nd.indices 生成的值相似(但很乱)。

======================

如果没有 orderpaths 的样本值,很难想象您的函数在做什么。或者更确切地说,仅仅通过阅读代码我无法想象它在做什么,而且没有示例我无法运行测试。对于采用标量 i,j 坐标的“黑盒”函数,您的方法已经差不多了。为了使其更快,您必须重新编写函数,以便它直接使用 np.indices 的子数组,而不是迭代地使用。

===============

获取 x 值的矢量化方法可能是

In [105]: I,J=np.indices((3,3))

In [106]: np.where(I*J,I*J,I+J)
Out[106]:
array([[0, 1, 2],
[1, 1, 2],
[2, 2, 4]])

where 在整个数组上执行 x = r*c if r*c != 0 else r+c

与 bool 掩码(数组 if 测试的好工具)相同的是:

In [114]: x=I*J

In [115]: mask = x==0

In [116]: x[mask]=(I+J)[mask]

In [117]: x
Out[117]:
array([[0, 1, 2],
[1, 1, 2],
[2, 2, 4]])

关于python - np.fromfunction : Reference other arrays,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37510982/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com