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

2d和1d numpy数组的交集

羊舌琛
2023-03-14
问题内容

对于数组A[:,3:]中也是数组中的每个元素B,我想将值设置为0,这将创建数组result

import numpy as np

A = np.array([[1, 1, 10, 101, 102, 103,   0,   0],
              [2, 2, 10, 102, 108,   0,   0,   0],
              [3, 3, 11, 101, 102, 106, 107, 108]])

B = np.array([101, 106, 108])

result = np.array([[1, 1, 10,   0, 102, 103,   0,   0],
                   [2, 2, 10, 102,   0,   0,   0,   0],
                   [3, 3, 11,   0, 102,   0, 107,   0]])

我知道有一种使用in1d和将其A作为1D数组进行广播的方法,但是我不知道该如何进行。

任何帮助将不胜感激。


问题答案:

如果将切片的2D数组馈入A[:,3:]到其中,它将把它展平为1D数组并与之进行比较,从而创建一个1D蒙版,可以对其进行整形并用于对该切片数组进行布尔索引以将元素设置为。单线实施看起来像这样-
np.in1d
B``TRUE``zeros

A[:,3:][np.in1d(A[:,3:],B).reshape(A.shape[0],-1)] = 0

样品运行-

In [37]: A
Out[37]: 
array([[  1,   1,  10, 101, 102, 103,   0,   0],
       [  2,   2,  10, 102, 108,   0,   0,   0],
       [  3,   3,  11, 101, 102, 106, 107, 108]])

In [38]: np.in1d(A[:,3:],B) # Flattened mask
Out[38]: 
array([ True, False, False, False, False, False,  True, False, False,
       False,  True, False,  True, False,  True], dtype=bool)

In [39]: np.in1d(A[:,3:],B).reshape(A.shape[0],-1) # Reshaped mask
Out[39]: 
array([[ True, False, False, False, False],
       [False,  True, False, False, False],
       [ True, False,  True, False,  True]], dtype=bool)

In [40]: A[:,3:][np.in1d(A[:,3:],B).reshape(A.shape[0],-1)] = 0 # Final code

In [41]: A
Out[41]: 
array([[  1,   1,  10,   0, 102, 103,   0,   0],
       [  2,   2,  10, 102,   0,   0,   0,   0],
       [  3,   3,  11,   0, 102,   0, 107,   0]])

为了简化操作,您可以创建展平的视图A并使用从中获得的1D蒙版获得np.in1d更优雅的解决方案。对于仅更改切片的解决方案A[:,3:],您可以使用.flat,然后像这样进行索引-

A[:,3:].flat[np.in1d(A[:,3:],B)] = 0

如果您想在整个范围内设置匹配项A,可以使用.ravel()-

A.ravel()[np.in1d(A,B)] = 0

我知道这.ravel()是一个视图,从文档来看,它似乎.flat也没有创建副本,因此它们应该很 便宜



 类似资料:
  • 问题内容: 我在这里研究了文档以及其他问题,但似乎我还没有掌握numpy数组中的子集的窍门。 我有一个numpy数组,为了方便讨论,让它定义如下: 现在我想选择由vector和指定的行和列。举个例子: 但是当我使用时: 然后,仅选择前五个对角线元素,而不选择整个5x5块。我发现的解决方案是这样做的: 但是我敢肯定,只有一个命令应该有一种方法可以完成这个简单的任务。 问题答案: 您已经获得了许多如何

  • 我有一个2D数组 行数=H 列数=W 2d数组本身=arr 它们都是整数 我的任务是返回从第一行的每个点开始的垂直线的最小和 输入 输出12 我曾想过使用递归来解决这个问题,但没有得到正确的结果。 函数取数组,我要计算的最小和的位置是(应该在第一行,因为它是一行)列数和行数,res是返回res的和,res在主函数中由arr在x行和y列初始化 我对这个想法很有把握,但我的总结方式可能是错误的

  • 我在java中有一个2D数组,试图在jsp中以表格形式打印它。下面的代码正在工作- 但是我需要根据数组的大小使其动态,而不是硬编码索引。请帮助解决这个问题。

  • 问题内容: 我要寻找一个量化的方式来索引的索引。 例如: 我想建立一个新的数组,以便该数组中的每一行(i)都是array的row(i),并由数组inds(i)的行索引。我想要的输出是: 我可以通过循环来实现: 但我正在寻找一种纯矢量化的解决方案。 问题答案: 使用索引数组对另一个数组进行索引时,每个索引数组的形状应与 输出 数组的形状匹配。您希望列索引匹配,并且您希望行索引匹配输出的行,例如: 由

  • 问题内容: 我想插入尺寸为4x4的2D数组“测试”(例如,实际上接近于1000x1000),其形状为8x8的网格。 我尝试使用griddata,但似乎只能使用1D吗?错误告诉我,“值和点的数量不同”,我犯错了吗? 问题答案: 您可以使用和进行此操作。 您需要确保新的X和Y范围与旧的范围相同,并且步长较小。这很容易:

  • 基本上,我要问的是给定一个正方形2D阵列和一个有效的补丁大小(2D子阵列的大小),我将如何做到这一点。最终,我不需要以任何方式存储子阵列,我只需要找到每个子阵列的中值并将它们存储在一个一维阵列中。中值和存储到新阵列对我来说很简单,我只是不知道如何处理原始2D阵列并正确拆分它。我已经尝试了几次,但一直出现越界错误。我有一个4x4: 我需要像这样拆分它 < code>[1,2] [3,4] [2,3]