首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以最毕奥尼亚的方式书写。Python 2

以最毕奥尼亚的方式书写。Python 2
EN

Stack Overflow用户
提问于 2018-01-26 15:04:39
回答 2查看 435关注 0票数 1

我有一条类似于此的警钟:

代码语言:javascript
复制
number_of_rows = 3
number_of_columns = 3
a = np.arange(number_of_rows*number_of_columns).reshape(number_of_rows,number_of_columns)
a

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

但我想要这样的东西:

代码语言:javascript
复制
array([[0, 100, 101],
       [3, 102, 103],
       [6, 7, 8]])

为了做到这一点,我希望避免一个接一个地这样做,我更喜欢在数组或矩阵中这样做,因为稍后我想扩展代码。不,我改变了初始矩阵的子矩阵(用数学术语,在这个例子中)。在示例中,考虑的列是1,2和行0,1。

代码语言:javascript
复制
columns_to_keep = [1,2] 
rows_to_keep = [0,1]

我的第一次尝试是:

代码语言:javascript
复制
a[rows_to_keep,:][:,columns_to_keep] = np.asarray([[100,101],[102,103]])

但是,这不会修改初始值a,我没有任何错误,所以a=

代码语言:javascript
复制
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

所以我已经实现了一段代码来完成这个任务:

代码语言:javascript
复制
b = [[100, 101],[102, 103]]

for i in range(len(rows_to_keep)):
    a[i,columns_to_keep] = b[i]

艾尔认为前几行都能做到这一点,我想知道如何以更快的方式进行切片。也是以这样的方式:

代码语言:javascript
复制
columns_to_keep = [0,2] 
rows_to_keep = [0,2]

所需的输出是

代码语言:javascript
复制
array([[100, 1, 101],
       [3, 4, 5],
       [102, 7, 103]]).

非常感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-26 18:30:00

使用像[1,2]这样的列表进行索引被称为高级索引。它本身产生一个副本,而不是一个视图。您必须使用一个索引表达式,而不是两个来赋值或更改值。也就是说,a[[1,2],:]是一个副本,a[[1,2],:][:,[1,2]] += 100修改那个副本,而不是原始的a

代码语言:javascript
复制
In [68]: arr = np.arange(12).reshape(3,4)

用切片进行索引;这是基本的索引:

代码语言:javascript
复制
In [69]: arr[1:,2:]
Out[69]: 
array([[ 6,  7],
       [10, 11]])

In [70]: arr[1:,2:] += 100

In [71]: arr
Out[71]: 
array([[  0,   1,   2,   3],
       [  4,   5, 106, 107],
       [  8,   9, 110, 111]])

使用列表执行相同的索引要求数组彼此之间进行“广播”。ix_是生成以下内容的一种简便方法:

代码语言:javascript
复制
In [73]: arr[np.ix_([1,2],[2,3])]
Out[73]: 
array([[106, 107],
       [110, 111]])

In [74]: arr[np.ix_([1,2],[2,3])] -= 100

In [75]: arr
Out[75]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

这里是ix_产生的-一个数组的元组,一个是(2,1)的形状,另一个是(1,2)。它们一起索引a (2,2)块:

代码语言:javascript
复制
In [76]: np.ix_([1,2],[2,3])
Out[76]: 
(array([[1],
        [2]]), array([[2, 3]]))
票数 1
EN

Stack Overflow用户

发布于 2018-01-26 15:42:05

对于连续行和列的情况,可以使用以下基本切片:

代码语言:javascript
复制
In [634]: a
Out[634]: 
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

In [635]: b = np.asarray([[100, 101],[102, 103]])

In [636]: a[:rows_to_keep[1]+1, columns_to_keep[0]:] = b

In [637]: a
Out[637]: 
array([[  0, 100, 101],
       [  3, 102, 103],
       [  6,   7,   8]])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48464015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档