Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >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

复制
相关文章
linux命令后台运行
1. command & : 后台运行,你关掉终端会停止运行 2. nohup command & : 后台运行,你关掉终端也会继续运行
RainMark
2019/09/10
9.9K0
DOS命令后台运行
在你批处理的相同目录下新建一个记事本,里面输入: set ws=wscript.createobject("wscript.shell") ws.run "win.bat /start",0 (其中win.bat为你自己的批处理名字,自己改) 然后把这个记事本保存为后缀名为.vbe的文件,到时候你只要运行这个vbe文件
gemron的空间
2019/11/04
2.3K0
在linux后台运行脚本的方法和命令
后台运行脚本 执行脚本test.sh:./test.sh 中断脚本test.sh:ctrl+c 在1的基础上将运行中的test.sh,切换到后台并暂停:ctrl+z 执行ctrl+z后,test.sh在后台是暂停状态(stopped),使用命令:bg number让其在后台开始运行(“number”是使用jobs命令查到的 [ ]中的数字,不是pid) 直接在后台运行脚本test.sh:./test.sh & 查看当前shell环境中已启动的任务情况:jobs 将test.sh切换到前台运行:fg %number(”number”为使用jobs命令查看到的 [ ] 中的数字,不是pid) 中断后台运行的test.sh脚本:先fg %number切换到前台,再ctrl+c;或是直接kill %number 以上两种在后台运行test.sh的方法,当遇到退出当前shell终端时,后台运行的test.sh也就结束了。这是因为以上两种方法使得test.sh在后台运行时,运行test.sh进程的父进程是当前shell终端进程,关闭当前shell终端时,父进程退出,会发送hangup信号给所有子进程,子进程收到hangup以后也会退出。所以要想退出当前shell终端时test.sh继续运行,则需要使用nohup忽略hangup信号。
大数据流动
2020/06/19
3.6K0
docker里运行docker命令
现有环境的jenkins是在docker里面运行的,需要执行docker相关命令才行。
py3study
2020/09/03
1.2K0
docker启动运行命令
列出所有容器,其中 docker ps用于查看正在运行的容器,ps -a则用于查看所有容器
头皮阴都都
2020/05/13
2.8K0
Docker运行命令示例
Docker是一个平台,可让你将应用程序开发,测试和部署为可在几乎任何地方运行的可移植的自给自足的容器。 docker run命令从给定的镜像创建一个容器,并使用给定的命令启动该容器。这是开始使用Docker时应熟悉的第一批命令之一。 在本文中,我们将使用官方的Nginx镜像来展示运行Docker容器的各种方法。 Docker运行命令 docker run命令采用以下形式: docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 从中创建容器的镜像名称是docker r
入门笔记
2022/06/02
1.3K0
Docker 容器中运行 Docker 命令
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/145668.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/29
2.7K0
如何使用Docker Compose在容器内运行Linux命令?
Docker Compose 是一个用于定义和运行多容器Docker应用程序的工具。除了可以启动应用程序的多个容器之外,Docker Compose还提供了一种在容器内部执行命令的方式。在本文中,我们将详细介绍如何使用Docker Compose在容器内运行Linux命令,并展示一些常见的应用场景。
网络技术联盟站
2023/06/08
3.2K0
如何使用Docker Compose在容器内运行Linux命令?
Linux||后台运行及查看状态命令
在使用Linux运行程序的时候,常常遇到需要耗费一定时间才能完成的文件,如果在前台运行,此时坐在电脑前的你只能被迫打开其他软件进行摸鱼。
小汪Waud
2023/02/16
7.8K0
Linux||后台运行及查看状态命令
如何在后台运行Linux命令
通常情况下,当你在终端运行一个命令,在你开始输入另外一个命令之前,你必须等待当前命令运行结束。这被称为在前台运行命令,或者前台进程。当一个进程在前台运行时,它占用了你的 shell,并且你可以通过输入设备和它进行交互。
雪梦科技
2020/05/11
8.2K0
如何在后台运行Linux命令
如何在后台运行Linux命令?
通常情况下,在 Linux 终端中运行命令时,我们必须等前一命令执行完成后,在输入并执行后一条命令,称之为在前台或前台进程中运行命令,进程在前台运行时,将占用您的外壳,并且您也可以使用输入设备与其终端进行交互。
杰哥的IT之旅
2020/06/18
3.9K0
如何使程序在Linux后台运行
这样一来,test程序就在后台运行了。但是,这样处理还不够,因为这样做虽然程序是在后台运行了,但log依然不停的输出到当前终端。因此,要让终端彻底的清静,还应将log重定向到指定的文件:
阿凡亮
2020/04/14
9K0
使程序在Linux下后台运行
我们计算的程序都是周期很长的,通常要几个小时甚至一个星期。我们用的环境是用putty远程连接到日本Linux服务器。所以使程序在后台跑有以下三个好处:
SingYi
2022/07/14
4.4K0
在 Linux or windows 上后台运行服务
  此时可以访问 http://ip:8000 验证服务是否成功启动了(详细操作见另一篇文章-Python 一行搭建文件服务器)
我是胖虎啊
2022/06/27
3.4K0
在 Linux or windows 上后台运行服务
在Windows上如何后台运行JuiceFS
JuiceFS的Badger引擎改造完成以后,需要在Windows下面进行后台运行。因为现有的JuiceFS中还没有在Windows下的后台运行实现,所以需要通过其他途径解决。
用户1260683
2022/03/30
3K0
在Windows上如何后台运行JuiceFS
在OS X上运行Docker
本文介绍了如何在OS X上运行Docker,通过使用boot2docker和VirtualBox,使基于Linux的Docker能在OS X上正常运行。同时,还探讨了如何将现有的基于Linux的Docker容器迁移到基于macOS的Docker。
Techeek
2018/01/04
2K0
在OS X上运行Docker
在docker中运行mysql实例
Docker是一种新兴的虚拟化技术,能够一定程度上的代替传统虚拟机。下图是容器跟虚拟机的对比
陈灬大灬海
2019/03/29
4K0
在docker中运行mysql实例
在docker中运行mysql实例
Docker是一种新兴的虚拟化技术,能够一定程度上的代替传统虚拟机。下图是容器跟虚拟机的对比
陈灬大灬海
2019/03/15
3.9K0
在docker中运行Kali Linux
当使用各种工具或创建隔离的环境时,Docker是虚拟化的绝佳替代品。Docker是轻量级的(在Linux上本机运行,没有虚拟机管理程序层),并且是不需要GUI的用例的理想选择。Offensive Security已经创建了一个官方的Kali Linux Docker镜像,名为`kalilinux/kali-rolling`,我们将在本文中用其创建并运行Kali Linux容器。
点火三周
2021/04/30
12K0
在docker中运行Kali Linux
在云主机后台进行python程序运行
nohup python main.py & nohup liunx自带的命令 注意:后面(&)!
py3study
2020/01/20
1.9K0

相似问题

在后台运行Docker命令?

12

在后台运行docker时,在docker中执行命令

17

在后台通过ssh远程运行docker logs命令

177

如何在后台Docker中运行Symfony命令

22

如何使docker命令在后台使用nohup运行

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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