gpt4 book ai didi

python - 如何通过 python 方式将 numpy.array 传递给 numpy.array 中对象的方法

转载 作者:行者123 更新时间:2023-11-28 22:11:52 25 4
gpt4 key购买 nike

我有一个 2d numpy 数组 txtStrs 包含字符串,我将这些字符串作为文本写入 matplotlib 图形轴 ax 使用例如

ax.text( posX, posY, txtStrs[0,0] )

稍后,我想更新这些文本(相同的位置、颜色等)而不重绘整个图形。因此,我将文本对象保存到另一个 numpy 数组。

当我现在想要更新文本时,我使用了两个 for 循环

    import numpy as np
import matplotlib.pyplot as plt
siz = 20

txtStrs = np.empty( (siz, siz), dtype = str )
txtObjs = np.empty( (siz, siz), dtype = object )

plt.figure()
ax = plt.gca()
for x in range(siz):
for y in range(siz)):
txtObjs[x,y] = ax.text( x, y, "" )

#Fill txtStrs with some string values

for x in range(siz):
for y in range(siz)):
txtObjs[x,y].set_text( txtStrs[x,y] )

最后一个 for 循环对我来说似乎是不必要的而且不是真正的 pythonic。如果我不需要调用 set_text 方法,我可以使用 numpy 的内在理解来进行更新。

我的问题是:是否有另一种方法将 txtStrs 传递给 txtObjs,例如使用矢量化、列表理解或其他任何方法?

最佳答案

循环是 Pythonic 的!

并且使用 matplotlib.text 对象的 set_text 方法也是有效的 Python。这就是我们使用对象的方式——使用它们的方法。

使用 numpy 我们尽量避免循环,但如果数组包含数字(或字符串)数据类型,那只会显着节省时间。然后它可以使用提供的数组方法在编译代码中进行迭代。您的 txtObjs 数组是对象 dtype,对此类数组的大多数操作都涉及 Python 级别的迭代,即使它是隐藏的。像列表一样,对象数组包含指向内存中其他地方的对象的指针。它必须引用每个对象并使用自己的方法。

对象数组的迭代比列表的迭代慢一点,尽管数组的多维特性可以使迭代更漂亮。

列表理解是编写 for 循环的一种巧妙方法 - 如果您要返回一个新列表。它不适用于就地修改。一些“矢量化”(隐藏)迭代的 numpy 函数也是如此。

如果 txtObjstxtStrs 是相同大小的列表,则

for a, b in zip(txtObjs, txtStrs):
a.set_text(b)

应该更新所有 text 对象。

对于二维数组:

for a, b in zip(txtObjs.ravel(), txtStrs.ravel()):

应该也可以。这些数组的二维形状妨碍了简单地传输值,尽管设置初始坐标可能很方便。

关于python - 如何通过 python 方式将 numpy.array 传递给 numpy.array 中对象的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55358808/

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