首页 > 解决方案 > 减去两个不同形状的 np.ndarray

问题描述

不同形状的ndarray,较大的形状为(22470,2),看起来像这样

df1

array([[-0.39911392,  0.46759156],
       [ 0.28343494,  0.88479157],
       [-0.0114085 , -1.23768313],
       ...,
       [-0.35930586,  0.54784439],
       [-0.37994004,  0.51332771],
       [-0.36309593,  0.49318486]])

代表 df1 数组异常值的小数组,其形状为 (675,2),看起来像这样

df2
array([[-0.04450032,  0.31053589],
       [-0.4320086 ,  0.14815988],
       [-0.07948631, -1.32638555],
       ...,
       [-0.32619787,  0.34910699],
       [-0.50870225, -0.230849  ],
       [-0.43532727,  0.49763502]])

所以试图减去他们两个有一个新的数组,其中包含除 df2 之外的 df1 中的所有内容,但它给了我这个错误

ValueError:操作数无法与形状一起广播 (22470,2) (675,2)

我怎样才能在 Python 中做到这一点?

标签: pythonnumpy

解决方案


“减去”两个数组不会对数组执行集合操作,它只是从另一个数组的值中减去一个数组的值(即 4 - 3 => 1)。

你想要做的基本上是一个集合操作。没有简单直接的方法来做你想做的事,你如何呈现它(但这并不意味着它不能完成)。比较浮点数是否完全相等是一个坏主意,相反,您会发现收集异常值的索引数组而不是它们的值更有用。然后你可以像这个问题一样索引你的数组。

所以这将是这样的

df1 = array([[1.234, 2.345], [3.3452, 2.456], [5.234, 7.453]])

# This is an array of indices, not float values.
df2 = array([1])

keep = np.ones(len(df1), dtype=bool)
keep[df2] = 0
newdf = df1[keep]

# newdf: [[1.234, 2.345], [5.234, 7.453]]

推荐阅读