我发现当numpy.where
是列表或foo==2
是foo
numpy.array
等条件时行为会有所不同>
foo = ["a","b","c"]
bar = numpy.array(["a","b","c"])
numpy.where(foo == "a") # Returns array([])
numpy.where(bar == "a") # Returns array([0])
我希望使用相同的命令使其适用于list或numpy.array,我担心如何有效地执行此操作。以下是否可以?
numpy.where(numpy.array(foo, copy=False) == "a") # Returns array([0])
numpy.where(numpy.array(bar, copy=False) == "a") # Returns array([0])
结果与预期一致,但这是满足我需求的最佳方式吗?每次使用numpy.array
构造函数是确保对象类型的最佳方法吗?
谢谢!
答案 0 :(得分:2)
对我来说,你的解决方案已经是最好的了:
numpy.where(numpy.array(foo, copy=False) == "a")
由于copy=False
,它简洁,清晰且完全有效。
答案 1 :(得分:1)
如果您真的在寻找最numpy
- esque解决方案,请使用np.asarray
:
numpy.where(numpy.asarray(foo) == "a")
如果您还希望您的代码能够使用numpy.ndarray
的子类,而不需要"下转换"将它们添加到ndarray
的基类,然后使用np.asanyarray
:
numpy.where(numpy.asanyarray(foo) == "a")
这适用于np.matrix
,例如,不将其转换为数组。我想这也可以确保np.matrix
实例在检查之前不会被复制或重建为数组。
注意:我认为副本是由np.array
为列表创建的,因为它需要构造数组对象。这可以在documentation for np.array
:
copy : bool, optional
If true (default), then the object is copied.
Otherwise, a copy will only be made if __array__ returns a copy, if
obj is a nested sequence, or if a copy is needed to satisfy any of the
other requirements (dtype, order, etc.).
在这种情况下, np.asarray
也会制作副本。