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

NumPy分配中重复索引的处理

史昀
2023-03-14
问题内容

我正在设置2D数组中多个元素的值,但是我的数据有时包含给定索引的多个值。

似乎总是分配了“更高”的值(请参见下面的示例),但是是否可以保证此行为,或者是否有机会获得不一致的结果?我怎么知道我可以按照我在矢量化分配中想要的方式来解释“稍后”?

也就是说,在我的第一个示例中,a肯定会始终包含4该内容,而在第二个示例中,它将打印values[0]吗?

很简单的例子:

import numpy as np
indices = np.zeros(5,dtype=np.int)
a[indices] = np.arange(5)
a # array([4])

另一个例子

import numpy as np

grid = np.zeros((1000, 800))

# generate indices and values
xs = np.random.randint(0, grid.shape[0], 100)
ys = np.random.randint(0, grid.shape[1], 100)
values = np.random.rand(100)

# make sure we have a duplicate index
print values[0], values[5]
xs[0] = xs[5]
ys[0] = ys[5]

grid[xs, ys] = values

print "output value is", grid[xs[0], ys[0]]
# always prints value of values[5]

问题答案:

在NumPy 1.9和更高版本中,通常不会对此进行很好的定义。

当前实现使用单独的迭代器同时遍历所有(广播的)花式索引(和分配数组),并且这些迭代器均使用C阶。换句话说,目前可以。由于您可能想更准确地了解它。如果mapping.c在处理这些问题的NumPy中进行比较,您会看到它使用PyArray_ITER_NEXT,该文档记录为C顺序。

为了将来,我会以不同的方式描绘这幅画。我认为使用更新的迭代器将所有索引+赋值数组一起迭代将是很好的。如果这样做,则可以保留订单以供迭代器决定最快的方式。如果您对迭代器保持开放状态,很难说会发生什么,但是您不能确定您的示例是否有效(可能仍然是一维情况,但是…)。

因此,据我所知,它目前可以使用,但尚未记录(据我所知),因此,如果您确实认为应该确保这样做,则需要游说并最好编写一些测试以确保它可以得到保证。因为至少有人倾向于说:如果它使事情变得更快,就没有理由确保C阶,但是当然也许有一个很好的理由隐藏在某处…

真正的问题是:您为什么仍要这么做?;)



 类似资料:
  • 问题内容: 假设我有一个整数的NumPy数组,如下所示: 我想找到数组的开始和结束索引,其中值的值大于重复的x倍(例如5倍)。因此,在上述情况下,其值为22和6。重复的22的开始索引为3,结束的索引为8。重复6相同。Python中是否有特殊的工具对您有所帮助?否则,我将遍历数组索引以获取索引,并将实际值与前一个进行比较。 问候。 问题答案: 使用@WarrenWeckesser在此处给出的和方法来

  • 问题内容: 我有一个Numpy数组和一个索引列表,我想将其值加1。该列表可能包含重复的索引,我希望增量可以随每个索引的重复次数而缩放。没有重复,命令很简单: 通过重复,我想出了以下方法。 这是最好的方法吗?假设和操作将导致相同的排序顺序是否有风险?我是否缺少一些简单的Numpy操作来解决此问题? 问题答案: 做完之后 为什么不这样做: (为进一步简化而编辑。)

  • 如果我定义一个像这样的分层索引数据框: 内容如下所示: 我知道如何提取与给定列对应的数据。例如。对于列: 如何提取符合以下标准集的数据: , , , column , , 列 和 、、列、以及从开始的所有列 是偶数 (顺便说一句,我做了不止一次rtfm,但我真的觉得难以理解。)

  • 主要内容:FAT的限制,索引分配方案FAT的限制 现有技术的局限性导致新技术的发展。 到目前为止,我们已经看到了各种分配方法; 他们都有几个优点和缺点。 文件分配表尽量解决尽可能多的问题,但会导致一个缺点。 块的数量越多,FAT的大小就越大。 因此,我们需要为文件分配表分配更多空间。 由于文件分配表需要被缓存,因此不可能在缓存中具有尽可能多的空间。 在这里我们需要一种可以解决这些问题的新技术。 索引分配方案 索引分配方案不是维护所有

  • 问题内容: 说我有一个数组 np.zeros((4,2)) 我有一个值[4,3,2,1]的列表,我想分配给以下位置:[(0,0),(1,1),(2,1),(3,0) ] 如何不使用for循环或展平数组来做到这一点? 我可以使用花哨的索引来检索值,但不能分配它们。 ======更新========= 感谢@hpaulj,我意识到原始代码中的错误是。 当我使用zeros_like初始化数组时,它默认为