np.meshgrid()函数 以及 三维空间中的坐标位置生成 以及 numpy.repeat()函数介绍

2023-11-08

一、np.meshgrid()函数

1、np.meshgrid()介绍

X, Y = np.meshgrid(x, y) 代表的是将x中每一个数据和y中每一个数据组合生成很多点,然后将这些点的x坐标放入到X中,y坐标放入Y中,并且相应位置是对应的

下面是官方文档,官方文档写的也很抽象,可以不读,直接看【2、np.meshgrid()生成坐标位置】中的例子

numpy.meshgrid(*xicopy=Truesparse=Falseindexing='xy')

Return coordinate matrices from coordinate vectors.

Make N-D coordinate arrays for vectorized evaluations of N-D scalar/vector fields over N-D grids, given one-dimensional coordinate arrays x1, x2,…, xn.

2、np.meshgrid()生成坐标位置

①其实np.meshgrid()生成的并不是二维空间中的坐标,还需要把对应位置的两个值合并在一起,才是坐标位置:

例如:

import numpy as np

x = np.linspace(0, 2, 3)
y = np.linspace(0, 1, 2)
X, Y = np.meshgrid(x, y)

coors = np.concatenate((X[:, :, None], Y[:, :, None]), axis=-1)
print(X)
print(Y)
print(X[:, :, None])
print(Y[:, :, None])
print(coors)

返回值:

# X
[[0. 1. 2.]
 [0. 1. 2.]]

# Y
[[0. 0. 0.]
 [1. 1. 1.]]

# X[:, :, None]
[[[0.]
  [1.]
  [2.]]

 [[0.]
  [1.]
  [2.]]]

# Y[:, :, None]
[[[0.]
  [0.]
  [0.]]

 [[1.]
  [1.]
  [1.]]]

# !!!!coors
[[[0. 0.]
  [1. 0.]
  [2. 0.]]

 [[0. 1.]
  [1. 1.]
  [2. 1.]]]

可以看到,np.meshgrid()生成的值,要再经过一次np.concatenate()才是坐标。

重点来了:

从上面例子的coors的输出值,可以看出:在生成坐标位置的矩阵时,是以最后一维的向量作为元素的,所以,其第-2维才是第真正的-1维,第-3维才是真正的-2维。

如下图所示: 

 ② np.meshgrid()也可以生成三维及以上维度的坐标

import numpy as np

x = np.linspace(0, 2, 3)
y = np.linspace(0, 1, 2)
z = np.linspace(0, 3, 4)
X, Y, Z = np.meshgrid(x, y, z)
coors = np.concatenate((X[:, :, :, None], Y[:, :, :, None], Z[:, :, :, None]), axis=-1)   # 注意这里是三个冒号
print(X)
print(Y)
print(Z)
print(coors)

返回值:

# X
[[[0. 0. 0. 0.]
  [1. 1. 1. 1.]
  [2. 2. 2. 2.]]

 [[0. 0. 0. 0.]
  [1. 1. 1. 1.]
  [2. 2. 2. 2.]]]

# Y
[[[0. 0. 0. 0.]
  [0. 0. 0. 0.]
  [0. 0. 0. 0.]]

 [[1. 1. 1. 1.]
  [1. 1. 1. 1.]
  [1. 1. 1. 1.]]]

# Z
[[[0. 1. 2. 3.]
  [0. 1. 2. 3.]
  [0. 1. 2. 3.]]

 [[0. 1. 2. 3.]
  [0. 1. 2. 3.]
  [0. 1. 2. 3.]]]

# coors
[[[[0. 0. 0.]
   [0. 0. 1.]
   [0. 0. 2.]
   [0. 0. 3.]]

  [[1. 0. 0.]
   [1. 0. 1.]
   [1. 0. 2.]
   [1. 0. 3.]]

  [[2. 0. 0.]
   [2. 0. 1.]
   [2. 0. 2.]
   [2. 0. 3.]]]


 [[[0. 1. 0.]
   [0. 1. 1.]
   [0. 1. 2.]
   [0. 1. 3.]]

  [[1. 1. 0.]
   [1. 1. 1.]
   [1. 1. 2.]
   [1. 1. 3.]]

  [[2. 1. 0.]
   [2. 1. 1.]
   [2. 1. 2.]
   [2. 1. 3.]]]]

但是,np.meshgrid()生成三维坐标位置也是有很大问题的:

无论怎么修改np.meshgrid()中x、y、z的顺序,都无法实现对x,y,z中的值都实现从小到大,而且先x从到大,然后y从小到大,最后z从小到大,见【二、1、】中例子的输出结果

二、不使用np.meshgrid()生成三维坐标位置

1、使用np.repeat()实现

numpy.repeat(arepeatsaxis=None)

        Repeat elements of an array.

Parameters:

        a:array_like

                Input array.

        repeats:int or array of ints

                The number of repetitions for each element. repeats is broadcasted to fit the                 shape of the given axis.

        axis:int, optional

                The axis along which to repeat values. By default, use the flattened input array,                 and return a flat output array.

Returns

        repeated_array:ndarray

                Output array which has the same shape as a, except along the given axis.

例子:

>>> np.repeat(3, 4)
    array([3, 3, 3, 3])
>>> x = np.array([[1,2],[3,4]])
>>> np.repeat(x, 2)   # 如果没写维度,就是flatten以后再repeat
    array([1, 1, 2, 2, 3, 3, 4, 4])
>>> np.repeat(x, 3, axis=1)
    array([[1, 1, 1, 2, 2, 2],
           [3, 3, 3, 4, 4, 4]])
>>> np.repeat(x, [1, 2], axis=0)  # 在axis=0这个维度上,第一行重复1次,第二行重复2次
    array([[1, 2],
           [3, 4],
           [3, 4]])

生成三维坐标位置:

(这个方式是我比较推荐的方式)

import numpy as np

x = np.linspace(0, 2, 3)
y = np.linspace(0, 1, 2)
z = np.linspace(0, 3, 4)
xx = np.repeat(x[None, :], len(y), axis=0)  # 第一个None对应Z,第二个None对应Y;所以后面是(len(z), len(y))
xxx = np.repeat(xx[None, :, :], len(z), axis=0)
yy = np.repeat(y[:, None], len(x), axis=1)
yyy = np.repeat(yy[None, :, :], len(z), axis=0)
zz = np.repeat(z[:, None], len(y), axis=1)
zzz = np.repeat(zz[:, :, None], len(x), axis=2)

# 这里zzz, yyy, xxx的顺序别错了,不然不好理解
coors = np.concatenate((zzz[:, :, :, None], yyy[:, :, :, None], xxx[:, :, :, None]), axis=-1)   # 这里zzz, yyy, xxx的顺序别错了,不然不好理解
print(coors)

返回值:

[[[[0. 0. 0.]
   [0. 0. 1.]
   [0. 0. 2.]]

  [[0. 1. 0.]
   [0. 1. 1.]
   [0. 1. 2.]]]


 [[[1. 0. 0.]
   [1. 0. 1.]
   [1. 0. 2.]]

  [[1. 1. 0.]
   [1. 1. 1.]
   [1. 1. 2.]]]


 [[[2. 0. 0.]
   [2. 0. 1.]
   [2. 0. 2.]]

  [[2. 1. 0.]
   [2. 1. 1.]
   [2. 1. 2.]]]


 [[[3. 0. 0.]
   [3. 0. 1.]
   [3. 0. 2.]]

  [[3. 1. 0.]
   [3. 1. 1.]
   [3. 1. 2.]]]]

2、通过np.where()获得坐标位置 

也是比较推荐的方法之一

zeros = np.zeros((4, 2, 3))
zzz, yyy, xxx = np.where(zeros==0)
print(zzz)
print(yyy)
print(xxx)

zzz = np.reshape(zzz, (4, 2, 3))
yyy = np.reshape(yyy, (4, 2, 3))
xxx = np.reshape(xxx, (4, 2, 3))
coors = np.concatenate((zzz[:, :, :, None], yyy[:, :, :, None], xxx[:, :, :, None]), axis=-1)   # 这里zzz, yyy, xxx的顺序别错了,不然不好理解
print(coors)

 返回值:

# zzz
[0 0 0 0 0 0 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3]

# yyy
[0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1]

# xxx
[0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2]

# coors
[[[[0 0 0]
   [0 0 1]
   [0 0 2]]

  [[0 1 0]
   [0 1 1]
   [0 1 2]]]


 [[[1 0 0]
   [1 0 1]
   [1 0 2]]

  [[1 1 0]
   [1 1 1]
   [1 1 2]]]


 [[[2 0 0]
   [2 0 1]
   [2 0 2]]

  [[2 1 0]
   [2 1 1]
   [2 1 2]]]


 [[[3 0 0]
   [3 0 1]
   [3 0 2]]

  [[3 1 0]
   [3 1 1]
   [3 1 2]]]]

三、重要的突破,通过转置(transpose())来得到直接的坐标

例子:

import numpy as np

zeros = np.zeros((4, 2, 3))
pp = np.where(zeros==0)
dd = np.transpose(pp)
print(dd)

返回值:

[[0 0 0]
 [0 0 1]
 [0 0 2]
 [0 1 0]
 [0 1 1]
 [0 1 2]
 [1 0 0]
 [1 0 1]
 [1 0 2]
 [1 1 0]
 [1 1 1]
 [1 1 2]
 [2 0 0]
 [2 0 1]
 [2 0 2]
 [2 1 0]
 [2 1 1]
 [2 1 2]
 [3 0 0]
 [3 0 1]
 [3 0 2]
 [3 1 0]
 [3 1 1]
 [3 1 2]]

类似的函数出了 np.where()  还可以使用  np.nonzero(),可见自己整理的另一篇关于 np.nonzero() 的blog 《》

四、np.indices()

np.indices()在参数 sparse=False 时,产生的数组就是想要的三维空间中的位置坐标

a = np.indices((4, 2, 3), sparse=False)
print(a)

返回:
array([[[[0, 0, 0],
         [0, 0, 0]],
        [[1, 1, 1],
         [1, 1, 1]],
        [[2, 2, 2],
         [2, 2, 2]],
        [[3, 3, 3],
         [3, 3, 3]]],  # 0
       [[[0, 0, 0],
         [1, 1, 1]],
        [[0, 0, 0],
         [1, 1, 1]],
        [[0, 0, 0],
         [1, 1, 1]],
        [[0, 0, 0],
         [1, 1, 1]]],  # 1
       [[[0, 1, 2],
         [0, 1, 2]],
        [[0, 1, 2],
         [0, 1, 2]],
        [[0, 1, 2],
         [0, 1, 2]],
        [[0, 1, 2],
         [0, 1, 2]]]])  # 2

(0的第一个元素,1的第一个元素,2的第一个元素)组成了一个坐标

(0的第2个元素,1的第2个元素,2的第2个元素)组成了一个坐标

以此类推。。。。

可以通过下面的代码得到最终坐标:

np.concatenate((a[0].reshape((-1, 1)), a[1].reshape((-1, 1)), a[2].reshape((-1, 1))), axis=1)

返回:
array([[0, 0, 0],
       [0, 0, 1],
       [0, 0, 2],
       [0, 1, 0],
       [0, 1, 1],
       [0, 1, 2],
       [1, 0, 0],
       [1, 0, 1],
       [1, 0, 2],
       [1, 1, 0],
       [1, 1, 1],
       [1, 1, 2],
       [2, 0, 0],
       [2, 0, 1],
       [2, 0, 2],
       [2, 1, 0],
       [2, 1, 1],
       [2, 1, 2],
       [3, 0, 0],
       [3, 0, 1],
       [3, 0, 2],
       [3, 1, 0],
       [3, 1, 1],
       [3, 1, 2]])

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

np.meshgrid()函数 以及 三维空间中的坐标位置生成 以及 numpy.repeat()函数介绍 的相关文章

随机推荐

  • 工控安全-S7协议

    文章目录 一 西门子PLC系统构成 二 S7协议结构 三 TPKT协议 四 COTP协议 4 1 COTP连接包 4 2 COTP功能包 五 S7Comm协议 5 1 头 Header 5 2 作业请求 Job 和确认数据响应 Ack Da
  • scp传输文件及文件夹

    在Linux与Windows中复制文件目录 常使用ftp服务 而Linux与Linux间传输文件目录 使用scp命令则可以轻松实现Linux与Linux间文件以及的传输 首先 必须在两台Linux中 必须安装openssh clients
  • ruoyi 若依框架在浏览器上面打开新页面标签(可视化大屏)

    需要设置四个地方 1 设置菜单路径 最重要的是路由地址 2 配置公共路由地址 3 设置路由地址 layout gt components gt Sidebar gt Link 文件 isNewPage return this to data
  • 小白入门级直观简洁VMware 16以及虚拟机Linux CentOS 7 64位的安装及配置

    任务一 安装VMware 16 下载地址 VMware 16 pro 提取码 0322 1 管理员身份运行安装程序 选择下一步 2 勾选 我接受许可协议 并点击下一步 3 勾选 自动安装 并点击下一步 4 根据本人电脑磁盘大小更改安装位置
  • 【软件工程基础复习整理】第四章需求分析(1)概念和需求收集

    需求分析 结构化方法 面向对象方法 需求分析 指开发人员通过细致的调差分析 详细 准确和完整地理解用户需要什么样地软件 将用户非形式地需求陈述转化为完整的需求定义 再将需求定义转换到相应的需求规格说明的过程 通常 把一整套的需求分析方法 技
  • frpc启动出现认证超时的错误:authorization timeout

    原因 客户端的时钟和服务器端时钟相差太大 这个超时时间可以在配置文件中通过 authentication timeout 这个参数来修改 单位为秒 默认值为 900 即 15 分钟 如果修改为 0 则 frps 将不对身份验证报文的时间戳进
  • excel禁止(避免)输入重复数据的设置方法

    来自http www ittribalwo com article 1419 html 第一 单个工作表excel避免重复输入的设置 excel禁止输入重复数据 用excel公式来解释 实际就是统计不重复个数 我们以A列的姓名列来讲解exc
  • QtWebEngine automation 自动化操作

    早期版本的 QtWebkit github 上有 Cisco 的 automation 开源项目 https github com cisco open source qtwebdriver Qt 后来采用的 QtWebEngine 我搜了
  • api接口响应类型定义

    public class Response
  • SpringCloud Config--概述

    SpringCloud Config概述 分布式系统面临的 配置问题 微服务意味着要将单体应用中的业务拆分成一个个子服务 每个服务的粒度相对较小 因此系统中会出现大量的服务 由于每个服务都需要必要的配置信息才能运行 所以一套集中式的 动态的
  • linux网络管理

    https blog csdn net sinat 17566367 article details 88912918 网络管理 https www cnblogs com starof p 4153663 html 配置文件 Linux网
  • 如何修改手机IP地址

    说起手机换IP大家可能没有对电脑换IP那么熟悉 但是现在智能手机能做到事情越来越多 手机换IP也成为许多工作需要 一部分人还不知道怎么操作 就跟着小编一起来看看手机换IP的几种方法 一 手动换IP 这个适合偶尔换IP 时间富裕的朋友 我们使
  • Tableau Prep使用

    下载了 Tableau Prep 2019 1 4 版本 安装后 注册使用14天的试用版 1 连接数据源 2 创建数据流 如下图 一共创建了2个数据流 分别存到2个不同的csv文件
  • 环境变量的作用和位置

    1 当要求系统运行一个程序而没有告诉它程序所在的完整路径时 系统除了在当前目录下面寻找此程序外 还应到环境变量path中指定的路径去找 用户通过设置环境变量 来更好的运行进程 一般说的环境变量都是指系统的环境变量 2 轻松打开win10环境
  • configure交叉编译 说明

    交叉编译某个应用程序时 通常需要 configure 来生成对应的 Makefile configure 最关键的三个选项是 host HOST 指定软件运行的系统平台 如果没有指定 将会运行 config guess 来检测 build
  • YoloV8改进策略:增加分支,减少漏检

    文章目录 摘要 数据集 如何解决问题 原始网络Yolov8 改进一 改进二 改进三 总结 扩展 YoloV5增加小目标检测的分支 摘要 如何检测小目标 这个一直是比较头疼的问题 如果都是小目标还好说 我们可以采用切图的方式 如果是数据集的目
  • 目标检测——day66 Scaled-YOLOv4: Scaling Cross Stage Partial Network

    Scaled Yolov4 可伸缩跨级部分网络 Scaled YOLOv4 1 Introduction 2 Related work 2 1 Real time object detection 2 2 Model scaling 模型缩
  • Spring boot 文件下载接口

    RequestMapping xzwj 复制代码 public void xzwj HttpServletResponse res String id throws IOException String fileName 12345 png
  • ES6 Set

    ES6 Set 数据结构 定义 特殊情况 set与字符串 Set的用法 数组去重 并集 交集 差集 定义 Set对象提供了一种数据结构 类似于数组 但是没有重复值 特殊情况 Set对象存储的值具有唯一性 所以添加元素时需要判断两个元素的恒等
  • np.meshgrid()函数 以及 三维空间中的坐标位置生成 以及 numpy.repeat()函数介绍

    一 np meshgrid 函数 1 np meshgrid 介绍 X Y np meshgrid x y 代表的是将x中每一个数据和y中每一个数据组合生成很多点 然后将这些点的x坐标放入到X中 y坐标放入Y中 并且相应位置是对应的 下面是