AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 76923255
Accepted
E. V. Hadzen
E. V. Hadzen
Asked: 2023-08-18 00:06:02 +0800 CST2023-08-18 00:06:02 +0800 CST 2023-08-18 00:06:02 +0800 CST

使用索引数组将 numpy 数组广播为更大尺寸的数组

  • 772

我有一个非常大的 2D numpy 数组 (A) 和一个较小的 2D 数组 (B),它的两个维度都较小。B是正方形。我有一个与 B 长度相同的索引数组。如下所示:

A = np.array([[0, 0, 0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0, 0, 0]])
B = np.array([[2, 4, 5, 7],
              [2, 7, 1, 3],
              [6, 1, 3, 5],
              [1, 6, 3, 2]])
Index = np.array([0, 1, 5, 6])

我想将B的内容添加到Index定义的行和列中的A中。A不一定全是0,所以需要加法。结果如下:

R = np.array([2, 4, 0, 0, 0, 5, 7, 0, 0],
             [2, 7, 0, 0, 0, 1, 3, 0, 0],
             [0, 0, 0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0, 0, 0],
             [6, 1, 0, 0, 0, 3, 5, 0, 0],
             [1, 6, 0, 0, 0, 3, 2, 0, 0],
             [0, 0, 0, 0, 0, 0, 0, 0, 0],
             [0, 0, 0, 0, 0, 0, 0, 0, 0]])

我尝试这样做:

A[Index, Index] += B

这给了我以下错误ValueError: shape mismatch: value array of shape (4,4) could not be broadcast to indexing result of shape (4,)

我不明白为什么这不起作用,因为我可以这样做:

A[Index, Index[0]:Index[0]+4] = B

然后值将全部出现在正确的行中,但不会出现在正确的列中。这是有道理的,因为我只是给它一个 4 列的块来让它出现在其中,但我希望它出现在 Index 定义的列中。

我还尝试了 np.add.at(A[Index], Index, B) 这让我觉得IndexError: index 6 is out of bounds for axis 0 with size 4.我不明白为什么它尝试访问 B 中的索引 6,其大小为 4。

numpy
  • 2 2 个回答
  • 16 Views

2 个回答

  • Voted
  1. Best Answer
    hpaulj
    2023-08-18T01:15:48+08:002023-08-18T01:15:48+08:00

    数组索引使用broadcasting. 使用 2 (4,) 数组作为索引,产生 s (4,) 形状结果:

    In [205]: A[Index,Index].shape
    Out[205]: (4,)
    
    In [206]: np.ix_(Index,Index)
    Out[206]: 
    (array([[0],
            [1],
            [5],
            [6]]),
     array([[0, 1, 5, 6]]))
    

    ix_生成 (4,1) 和 (1,4) 数组。这些一起广播以索引 (4,4) 形状:

    In [207]: A[np.ix_(Index,Index)].shape
    Out[207]: (4, 4)
    

    与您的匹配B:

    In [208]: A[np.ix_(Index,Index)] = B
    

    有一个主要的 numpy 索引页面,这些细节在 参考资料advanced indexing部分中处理。

    • 2
  2. Nick ODell
    2023-08-18T00:33:29+08:002023-08-18T00:33:29+08:00

    您可以尝试使用np.repeat()在行轴上重复索引,并np.tile()在列轴上重复索引。

    这将为您提供具有以下模式的索引:

    >>> np.repeat(Index, index_len), np.tile(Index, index_len)
    (array([0, 0, 0, 0, 1, 1, 1, 1, 5, 5, 5, 5, 6, 6, 6, 6]),
     array([0, 1, 5, 6, 0, 1, 5, 6, 0, 1, 5, 6, 0, 1, 5, 6]))
    

    然后,您可以用它来索引 A。

    index_len = len(Index)
    A[np.repeat(Index, index_len), np.tile(Index, index_len)] = B.flatten()
    

    (B.flatten()这是必需的,因为左侧的形状也被展平。)

    结果:

    array([[2, 4, 0, 0, 0, 5, 7, 0, 0],
           [2, 7, 0, 0, 0, 1, 3, 0, 0],
           [0, 0, 0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0, 0, 0],
           [6, 1, 0, 0, 0, 3, 5, 0, 0],
           [1, 6, 0, 0, 0, 3, 2, 0, 0],
           [0, 0, 0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0, 0, 0]])
    
    • 0

相关问题

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    使用 <font color="#xxx"> 突出显示 html 中的代码

    • 2 个回答
  • Marko Smith

    为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类?

    • 1 个回答
  • Marko Smith

    您可以使用花括号初始化列表作为(默认)模板参数吗?

    • 2 个回答
  • Marko Smith

    为什么列表推导式在内部创建一个函数?

    • 1 个回答
  • Marko Smith

    我正在尝试仅使用海龟随机和数学模块来制作吃豆人游戏

    • 1 个回答
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 个回答
  • Marko Smith

    为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)?

    • 4 个回答
  • Marko Smith

    为什么库中不调用全局变量的构造函数?

    • 1 个回答
  • Marko Smith

    std::common_reference_with 在元组上的行为不一致。哪个是对的?

    • 1 个回答
  • Marko Smith

    C++17 中 std::byte 只能按位运算?

    • 1 个回答
  • Martin Hope
    fbrereto 为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 您可以使用花括号初始化列表作为(默认)模板参数吗? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi 为什么列表推导式在内部创建一个函数? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A fmt 格式 %H:%M:%S 不带小数 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python C++20 的 std::views::filter 未正确过滤视图 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute 为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa 为什么库中不调用全局变量的构造函数? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis std::common_reference_with 在元组上的行为不一致。哪个是对的? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev 为什么编译器在这里错过矢量化? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan C++17 中 std::byte 只能按位运算? 2023-08-17 17:13:58 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve