从 Numpy 矩阵构建 Python 集
我正在尝试执行以下
>> from numpy import *
>> x = array([[3,2,3],[4,4,4]])
>> y = set(x)
TypeError: unhashable type: 'numpy.ndarray'
如何轻松有效地创建包含 Numpy 数组中所有元素的集合?
I'm trying to execute the following
>> from numpy import *
>> x = array([[3,2,3],[4,4,4]])
>> y = set(x)
TypeError: unhashable type: 'numpy.ndarray'
How can I easily and efficiently create a set with all the elements from the Numpy array?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
如果您想要一组元素,这里是另一种可能更快的方法:
PS:在
x.flat
、x.flatten()<之间执行比较之后/code> 和
x.ravel()
在 10x100 数组上,我发现它们的执行速度大致相同。对于 3x3 数组,最快的版本是迭代器版本:我推荐它,因为它是内存消耗较小的版本(它可以随着数组的大小很好地扩展)。
PPS:还有一个 NumPy 函数可以执行类似的操作:
这确实会生成一个与
set(x.flat)
具有相同元素的 NumPy 数组,但作为 NumPy 数组。这非常快(几乎快了 10 倍),但是如果您需要一个set
,那么执行set(numpy.unique(x))
会比其他方法慢一点程序(构建一套需要很大的开销)。If you want a set of the elements, here is another, probably faster way:
PS: after performing comparisons between
x.flat
,x.flatten()
, andx.ravel()
on a 10x100 array, I found out that they all perform at about the same speed. For a 3x3 array, the fastest version is the iterator version:which I would recommend because it is the less memory expensive version (it scales up well with the size of the array).
PPS: There is also a NumPy function that does something similar:
This does produce a NumPy array with the same element as
set(x.flat)
, but as a NumPy array. This is very fast (almost 10 times faster), but if you need aset
, then doingset(numpy.unique(x))
is a bit slower than the other procedures (building a set comes with a large overhead).数组的不可变对应项是元组,因此,尝试将数组数组转换为元组数组:
The immutable counterpart to an array is the tuple, hence, try convert the array of arrays into an array of tuples:
如果您想从
ndarray
中包含的元素创建一组,但如果您想创建一组ndarray
,则上述答案有效> 对象 – 或使用 ndarray 对象作为字典中的键 – 那么您必须为它们提供一个可散列的包装器。请参阅下面的代码作为一个简单的示例:使用包装类非常简单:
The above answers work if you want to create a set out of the elements contained in an
ndarray
, but if you want to create a set ofndarray
objects – or usendarray
objects as keys in a dictionary – then you'll have to provide a hashable wrapper for them. See the code below for a simple example:Using the wrapper class is simple enough:
如果您想要一组元素:
对于一组行:
If you want a set of the elements:
For a set of the rows:
我喜欢 xperroni 的想法。但我认为可以使用从 ndarray 直接继承而不是包装它来简化实现。
NumPy ndarray 可以被视为派生类并用作可哈希对象。
view(ndarray)
可用于反向转换,但在大多数情况下甚至不需要它。I liked xperroni's idea. But I think implementation can be simplified using direct inheritance from ndarray instead of wrapping it.
NumPy
ndarray
can be viewed as derived class and used as hashable object.view(ndarray)
can be used for back transformation, but it is not even needed in most cases.添加到@Eric Lebigot 和他的精彩帖子。
以下方法实现了构建张量查找表的技巧:
输出:
np.unique 文档
Adding to @Eric Lebigot and his great post.
The following did the trick for building a tensor lookup table:
output:
np.unique documentation