当前位置: 首页 > 面试题库 >

映射一个NumPy数组

东方森
2023-03-14
问题内容

是否可以将NumPy数组映射到位? 如果是,怎么办?

给定a_values-2D数组-这是目前为我完成窍门的一些代码:

for row in range(len(a_values)):
    for col in range(len(a_values[0])):
        a_values[row][col] = dim(a_values[row][col])

但是它是如此丑陋,以至于我怀疑在NumPy内的某个地方一定有一个函数可以对以下内容执行相同的操作:

a_values.map_in_place(dim)

但是如果存在上述类似内容,我将无法找到它。


问题答案:

只有在空间有限的情况下,才值得尝试就地执行此操作。如果是这样,可以通过遍历数组的展平视图来稍微加快代码的速度。由于在可能的情况下会reshape返回新视图,因此不会复制数据本身(除非原始数据具有异常的结构)。

我不知道一种更好的方法来实现任意Python函数的真正就地应用。

>>> def flat_for(a, f):
...     a = a.reshape(-1)
...     for i, v in enumerate(a):
...         a[i] = f(v)
... 
>>> a = numpy.arange(25).reshape(5, 5)
>>> flat_for(a, lambda x: x + 5)
>>> a

array([[ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24],
       [25, 26, 27, 28, 29]])

一些时间:

>>> a = numpy.arange(2500).reshape(50, 50)
>>> f = lambda x: x + 5
>>> %timeit flat_for(a, f)
1000 loops, best of 3: 1.86 ms per loop

它大约是嵌套循环版本的两倍:

>>> a = numpy.arange(2500).reshape(50, 50)
>>> def nested_for(a, f):
...     for i in range(len(a)):
...         for j in range(len(a[0])):
...             a[i][j] = f(a[i][j])
... 
>>> %timeit nested_for(a, f)
100 loops, best of 3: 3.79 ms per loop

当然矢量化仍然更快,因此,如果可以进行复制,请使用以下方法:

>>> a = numpy.arange(2500).reshape(50, 50)
>>> g = numpy.vectorize(lambda x: x + 5)
>>> %timeit g(a)
1000 loops, best of 3: 584 us per loop

如果可以dim使用内置的ufuncs进行重写,请不要vectorize

>>> a = numpy.arange(2500).reshape(50, 50)
>>> %timeit a + 5
100000 loops, best of 3: 4.66 us per loop

numpy就像+=您所期望的那样执行类似的操作-
因此您可以免费使用就地应用程序来获得ufunc的速度。有时甚至更快!请参阅此处的示例

顺便说一句,我对这个问题的原始答案很荒谬,涉及到将索引向量化到,这个答案在编辑历史记录中可以看到a。它不仅必须做一些时髦的东西,以旁路vectorize的类型检测机制,它竟然是一样缓慢,因为嵌套循环版本。太聪明了!



 类似资料:
  • 问题内容: 问题: 给定一个字符串数据数组 我想要一个返回索引数据集的函数 和一个查询表 这样 是真的。请注意,和都可以进行排列,以使上述内容成立并且很好(即,的顺序不必等于中的首次出现的顺序)。 解决方法: 我目前有以下慢速解决方案 有更快的方法吗?我觉得我没有在这里充分利用numpy的潜力。 问题答案: 您可以使用以下参数: 如果愿意,可以从以下两个数组重建原始数组: 如果使用熊猫,将实现相同

  • 我需要将Java转换为的实例(包括映射内容) 我应该用什么来代替来使此代码可编译?

  • 在numpy数组上映射函数最有效的方法是什么?我在当前项目中的做法如下: 然而,这看起来可能是非常低效的,因为我使用列表理解来构造新的数组作为Python列表,然后再将其转换回Numpy数组。 我们能做得更好吗?

  • 我有两个地图,键为整数,值为双倍。 我想创建第三个按键排序的映射,值将是两个映射的双精度列表。 地图1: Map2: 最终地图: 如上所述,如果一个地图中的一个键在另一个地图中丢失,则另一个地图的最终地图中的值应默认为0.00 我可以使用putAll方法将所有键放入第三张地图。但如何按照我的意愿设定这些值呢? 感谢阅读!

  • 问题内容: 有没有那么冗长的替代方案: 我想出了这个: 这节省了一个缩进,但仍然很丑陋。 我希望看起来像这样的伪代码: 有没有类似的东西存在? 问题答案: 我认为您正在寻找ndenumerate。 关于性能。它比列表理解要慢一些。 如果您担心性能,可以通过查看实现来进一步优化,该实现有两件事,转换为数组并循环。如果知道有数组,则可以调用平面迭代器的属性。

  • 问题 你有一个对象数组,想把这些对象映射到另一个数组中,就像 Ruby 的映射一样。 解决方案 使用 map() 和匿名函数,但不要忘了还有列表推导。 electric_mayhem = [ { name: "Doctor Teeth", instrument: "piano" }, { name: "Janice", instrument: "lead g