使用list或numpy.array

时间:2016-09-13 15:16:39

标签: python arrays numpy

我发现当numpy.where是列表或foo==2foo 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构造函数是确保对象类型的最佳方法吗?

谢谢!

2 个答案:

答案 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也会制作副本。