Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >numpy中是否有可能在不改变内存顺序和迭代器的情况下交换矩阵的x,y?

numpy中是否有可能在不改变内存顺序和迭代器的情况下交换矩阵的x,y?
EN

Stack Overflow用户
提问于 2022-01-17 09:24:54
回答 1查看 85关注 0票数 1

我正在尝试从转向fortranc++。我主要处理的是巨大的图像,坐标方向是x:从左到右,y:自上而下,像素被存储在行中,这是图像格式中常见的。

Numpy说,它也按行存储矩阵。就好而言,它与fortran/c++保存图像是一样的。但是,请参阅下面的示例,灰色从黑色到白色依次排列。让我们创建第一行为123等的图像3x3。

黑白图像如预期,与matplotlib不显示(垫)

代码语言:javascript
运行
AI代码解释
复制
mat = np.array([1,2,3,4,5,6,7,8,9], 'i1').reshape(3,3)

接下来,我使用下面的代码获取有关矩阵的信息。例程打印:在位置x=1, y=0的值,在内存中的位置,看数组是否被复制,大步和迭代器。

代码语言:javascript
运行
AI代码解释
复制
def pr(a):
    x=1; y=0;
    print(a[x,y])
    print(a.ctypes.data, a.strides, a.ravel(order='K'), [x for x in a.flat], a.flatten(order='K'))
    print(a.flags)

对于矩阵matC阶,我得到

代码语言:javascript
运行
AI代码解释
复制
4
94598176807408 (3, 1) [1 2 3 4 5 6 7 8 9] [1, 2, 3, 4, 5, 6, 7, 8, 9] [1 2 3 4 5 6 7 8 9]
  C_CONTIGUOUS : True
  F_CONTIGUOUS : False

所以很明显,x,y是交换的,因为x=1y=0像素值是2,而不是4,所以我已经更改为F顺序。

代码语言:javascript
运行
AI代码解释
复制
# mat = mat.ravel(order='K').reshape(3,3, order='F')
mat.strides = (1,3)
# mat = np.swapaxes(mat, 0, 1)

在此基础上,给出了得到具有相同结果的F阶的三种可能性。

代码语言:javascript
运行
AI代码解释
复制
2
94598176807408 (1, 3) [1 2 3 4 5 6 7 8 9] [1, 4, 7, 2, 5, 8, 3, 6, 9] [1 2 3 4 5 6 7 8 9]
  C_CONTIGUOUS : False
  F_CONTIGUOUS : True

现在,当使用与以前相同的内存布局的F顺序时,图像被交换了。

如您所见,x=1 y=2的值2是正确的,使用mat[x,y]是正确的,内存顺序是正确的,但是迭代器是错误的1 4 7 ...。后果是,保存或显示形象是不好的,所有的交换。不按内存顺序排列的迭代器具有很大的性能惩罚。

问题是:如何用交换的x,y来设置numpy矩阵,而不复制图像和所有其他属性都是C级的。我尝试过设置C_CONTIGUOUS=True,但这是不可能的。

一种方法是使用C-阶,但是在所有这样的矩阵上,必须使用反向索引y,x,问题是它非常混乱,所有的向量都是正规的(x,y,z),有些对象使用交换索引顺序。正确的轴的命名顺序有助于进一步的图像空间操作。

也许有可能扩展numpy,使用只返回mat[y,x]或eg的其他索引方法,比如mat.swap2[x,y]mat[*reversed((x,y))]。但是否有更好的解决办法?

下面是fortranc++中的两个示例。armadillo矩阵库(因为c/c++似乎没有定义自己的泛型矩阵对象)。这两个示例都使用F顺序,索引正确mat[x,y],内存布局与输入图像的二进制布局相同,逐行、迭代器在内存布局中。在我看来奇怪的是,F顺序中的numpy不支持相同的行为。或者我根本就不懂裸体的哲学。

fortran中,保存和迭代这样的矩阵是按内存顺序进行的(此处未显示)。

代码语言:javascript
运行
AI代码解释
复制
...
    integer(1) :: mat(0:2,0:2)      ! matrix 3x3 indexing 0,1,2
    data mat /1,2,3,4,5,6,7,8,9/    ! memory order
    print*, mat(1,0)                ! value for x=1 y=0 is 2 ok
...

C++和armadillo中,保存和迭代是按内存顺序进行的(此处未显示)。

代码语言:javascript
运行
AI代码解释
复制
#define ARMA_U8_TYPE   uint8_t
#define ARMA_S8_TYPE    int8_t        // define support for int8 instead of char
#include <armadillo>
...
    using namespace arma;
    int8_t amem[] = {1,2,3,4,5,6,7,8,9};        // memory order
    Mat<int8_t> mat(amem, 3,3,  false,true);    // matrix 3x3
    cout << (int)mat(1,0) << "\n";              // value for x=1 y=0 is 2 ok
...
EN

回答 1

Stack Overflow用户

发布于 2022-01-20 09:33:44

首先,numpy对于列主要模式有令人困惑的术语,对于2D和更多的模式,F_CONTIGUOUS在内存中从不是连续的。它就像视图的设计和内存布局总是C。由于性能原因和您指定的轴分配,像许多人一样使用列的主要顺序是比较自然的,但在numpy中并不容易。

此外,内置/扩展不允许仅使用setattr()直接扩展numpy类,但您可以派生自己的类。

为了在numpy中简单起见,始终使用默认的C顺序(行大顺序)和交换轴作为mat[z,y,x]。在我看来,这似乎是最不令人困惑的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70745254

复制
相关文章
yhd-VBA从一个工作簿的某工作表中查找符合条件的数据插入到另一个工作簿的某工作表中
【问题】我们在工作中有时要在某个文件(工作簿)中查找一些数据,提取出来。常用的方法是打开文件,来查找,再复制保存起来。如果数据少还是手工可以的,如果数据多了可能就。。。。
哆哆Excel
2022/10/31
5.9K0
VBA代码:拆分工作簿示例——将工作簿中的每个工作表保存为单独的工作簿
只需在要拆分的工作簿中运行上述代码,就可将该工作簿中的所有工作表全部保存为单独的工作簿。
fanjy
2022/06/04
4.4K0
VBA代码:拆分工作簿示例——将工作簿中的每个工作表保存为单独的工作簿
自动合并工作簿中各工作表数据
合并多表数据是工作中常见的情形。本文介绍一种在Excel及Power BI中不使用任何公式,快速合并一个工作簿中多个工作表的方法。
wujunmin
2021/09/07
1.7K0
自动合并工作簿中各工作表数据
ExcelVBA汇总多工作簿中指定工作表到新工作簿
哆哆Excel
2023/09/09
5310
ExcelVBA汇总多工作簿中指定工作表到新工作簿
VBA: 将多个工作簿的第一张工作表合并到一个工作簿中
文章背景: 在工作中,有时需要将多个工作簿进行合并,比如将多份原始数据附在报告之后。一般的操作方法是打开两个工作簿(目标工作簿和待转移的工作簿),然后选中需要移动的工作表,右键单击以后选择“移动或复制”。接下来在新的对话框里面进行设置。
Exploring
2022/09/20
6.5K0
VBA:  将多个工作簿的第一张工作表合并到一个工作簿中
快速汇总多个工作簿/工作表中的数据(Excel工具推荐)
很多数据散落在很多工作表或者工作簿中,由于某项工作我们需要将这些数据做个汇总。比方,我们有以下三个工作簿
wujunmin
2021/09/07
11.3K1
快速汇总多个工作簿/工作表中的数据(Excel工具推荐)
VBA实例一、工作簿按表拆分成多个工作簿
大家好,本节主要介绍,通过VBA程序,将单个工作簿中的多个工作表,按表拆分成多个独立工作簿。
无言之月
2022/11/11
4K0
VBA实例一、工作簿按表拆分成多个工作簿
常用功能加载宏——一个工作簿的工作表另存为工作簿
前面实现了多个工作簿和合并到一个工作簿的功能,反过来,将一个工作簿里的工作表,另存为多个工作簿,然后分发给不同的人,应该也是经常会碰到的。让我们看看使用VBA如何实现:
xyj
2020/07/28
1.7K0
常用功能加载宏——一个工作簿的工作表另存为工作簿
Excel应用实践21:实现工作簿所有工作表中的多值替换
有两个工作簿,一个工作簿中存放着要查找并替换成的文本,如下图1所示,列A中是要查找的文本,将列A中查找到的文本替换成列B中相应的文本,例如,将找到的“Excel”替换成“完美Excel”。
fanjy
2019/09/29
3.3K0
Excel应用实践10:合并多个工作簿中的数据
我有超过50个具有相同格式的Excel文件,它们的列标题相同,并且都放置在同一文件夹,有什么快速的方法将它们合并到一个单独的Excel文件的一个工作表中?
fanjy
2019/07/19
2.4K0
Workbook工作簿对象属性
Activeworkbook.name表示当前活动工作簿的name属性,即当前excel文件的名称为vba.xlsm。
无言之月
2019/10/13
1.9K0
Workbook工作簿对象基础
大家好,前面已经介绍了常用的range单元格对象和worksheet普通工作表对象,本节开始介绍工作簿workbook对象,首先通过下图回顾一下常用对象的层级关系。
无言之月
2019/10/13
3.1K0
示例工作簿分享:在用户窗体中创建键盘
这是在ozgrid.com中看到的一个工作簿,正如作者所说,也许不酷,也可能完全没有用,但这是用户窗体形式的鼠标键盘。如下图1所示。
fanjy
2023/09/15
1930
示例工作簿分享:在用户窗体中创建键盘
Java保护Excel工作簿和工作表
出于安全原因,你可能需要保护整个工作簿或工作表。 有时,你甚至可能还需要保护某个工作表,但却保留指定的单元格进行编辑。 本文将介绍如何使用Free Spire.XLS for Java来实现这些操作。
崔笑颜
2020/06/08
1.6K0
常用功能加载宏——多个工作簿合并到一个工作簿
对于做管理工作的,收集表格这种工作应该会经常有,设计一个表格模板,发给各个有关单位去填写,收集起来后再合并到一起。
xyj
2020/07/28
2K0
常用功能加载宏——多个工作簿合并到一个工作簿
Workbook工作簿对象方法(一)
大家好,前面介绍了工作簿对象的属性,本节开始介绍工作簿对象的常用方法。这些常用方法可以实现平时用手工的新建、打开、激活、保存excel表等功能。
无言之月
2019/10/13
6.8K0
Excel事件(三)工作簿事件
大家好,上节介绍工作表事件,本节将介绍工作簿事件,工作簿数量较多,但并没有工作表事件常用,只简单介绍几个常用的工作簿事件。
无言之月
2019/10/13
2.3K0
Workbook工作簿对象方法(二)
大家好,上节介绍过部分工作簿对象的常用方法-创建和打开,本节将继续介绍工作簿对象的激活、保存和关闭方法。
无言之月
2019/10/13
5K0
如何在前端应用中合并多个 Excel 工作簿
SpreadJS是纯前端的电子表格控件,可以轻松加载 Excel 工作簿中的数据并将它们呈现在前端浏览器应用的网页上。
葡萄城控件
2023/10/11
4730
如何在前端应用中合并多个 Excel 工作簿
Excel应用实践11:合并多个工作簿中的数据——示例2
在上一篇文章《Excel应用实践10:合并多个工作簿中的数据》中,我们使用代码快速合并超过50个Excel工作簿文件,然而,如果要合并的工作簿中工作表的名称不相同,但位于每个工作簿的第1个工作表;并且,要在合并后的工作表的第1列中输入相对应的工作簿文件名,以便知道合并后的数据来自哪个工作簿文件。
fanjy
2019/07/19
2.9K0

相似问题

动态引用给定工作簿的单元格内的另一个工作簿

12

保存工作簿失败

28

选择另一个工作簿中的单元格

13

计算另一个工作簿中工作表的单元格

23

引用另一个工作簿中的单元格,该工作簿以单元格A1中的值命名

21
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档