BNU-FZH

fengzhenhua@outlook.com

git mergegit rebase的区别, 如图

merge和rebase的区别

一个事情很容易判断,使用merge会得到一个复杂的路线图,但是rebase会生成一条清晰的发展路线,所以还是建议使用rebase.

之前我找到了三个工具来删除重复文件,目前的工作主力系统为archlinux, 一般选择软件的顺序为官方仓库AurGithub, 因为在之前的三个工具中只有fdupesarchlinux官方仓库收录的工具,所以优先安装了。今天无意间又发现一款官方工具rmlint, 它是一个命令行工具,用于在 Linux 系统中查找和删除重复的和类似 lint 的文件。它有助于识别具有相同内容的文件,以及各种形式的冗余或 lint,例如空文件、损坏的符号链接和孤立文件。使用方法:

  • 切换到要操作的文件目录,执行rmlint, 然后它会生成一个当前目录的重复及空目录等情况列表,同时有一个脚本rmlint.sh和一个目录结构文件rmlint.json.

  • 若要真的执行删除重复的操作,在要操作的目录中执行./rmlint.sh, 然后在弹出的提示中,输入任意内容内执行完毕。

  • 使用教程参考rmlint doc

在编辑或修改配置文件或旧文件前,我经常会把它们备份到硬盘的某个地方,因此我如果意外地改错了这些文件,我可以从备份中恢复它们。但问题是如果我忘记清理备份文件,一段时间之后,我的磁盘会被这些大量重复文件填满 —— 我觉得要么是懒得清理这些旧文件,要么是担心可能会删掉重要文件。如果你们像我一样,在类 Unix 操作系统中,大量多版本的相同文件放在不同的备份目录,你可以使用下面的工具找到并删除重复文件。

提醒一句:

在删除重复文件的时请尽量小心。如果你不小心,也许会导致意外丢失数据。我建议你在使用这些工具的时候要特别注意。

出于本指南的目的,我将讨论下面的三个工具:

  1. Rdfind
  2. Fdupes
  3. FSlint

这三个工具是自由开源的,且运行在大多数类 Unix 系统中。

1. Rdfind

Rdfind 意即 redundant data find(冗余数据查找),是一个通过访问目录和子目录来找出重复文件的自由开源的工具。它是基于文件内容而不是文件名来比较。Rdfind 使用排序算法来区分原始文件和重复文件。如果你有两个或者更多的相同文件,Rdfind 会很智能的找到原始文件并认定剩下的文件为重复文件。一旦找到副本文件,它会向你报告。你可以决定是删除还是使用硬链接或者符号(软)链接代替它们。

安装 Rdfind

Rdfind 存在于 AUR 中。因此,在基于 Arch 的系统中,你可以像下面一样使用任一如 Yay AUR 程序助手安装它。

在 Debian、Ubuntu、Linux Mint 上:

1
$ sudo apt-get install rdfind

在 Fedora 上:

1
$ sudo dnf install rdfind

在 RHEL、CentOS 上:

1
$ sudo yum install epel-release $ sudo yum install rdfind

用法

一旦安装完成,仅带上目录路径运行 Rdfind 命令就可以扫描重复文件。

正如你看到上面的截屏,Rdfind 命令将扫描 ~/Downloads 目录,并将结果存储到当前工作目录下一个名为 results.txt 的文件中。你可以在 results.txt 文件中看到可能是重复文件的名字。

1
$ cat results.txt # Automatically generated # duptype id depth size device inode priority name DUPTYPE_FIRST_OCCURRENCE 1469 8 9 2050 15864884 1 /home/sk/Downloads/tor-browser_en-US/Browser/TorBrowser/Tor/PluggableTransports/fte/tests/dfas/test5.regex DUPTYPE_WITHIN_SAME_TREE -1469 8 9 2050 15864886 1 /home/sk/Downloads/tor-browser_en-US/Browser/TorBrowser/Tor/PluggableTransports/fte/tests/dfas/test6.regex [...] DUPTYPE_FIRST_OCCURRENCE 13 0 403635 2050 15740257 1 /home/sk/Downloads/Hyperledger(1).pdf DUPTYPE_WITHIN_SAME_TREE -13 0 403635 2050 15741071 1 /home/sk/Downloads/Hyperledger.pdf # end of file

通过检查 results.txt 文件,你可以很容易的找到那些重复文件。如果愿意你可以手动的删除它们。

此外,你可在不修改其他事情情况下使用 -dryrun 选项找出所有重复文件,并在终端上输出汇总信息。

1
$ rdfind -dryrun true ~/Downloads

一旦找到重复文件,你可以使用硬链接或符号链接代替他们。

使用硬链接代替所有重复文件,运行:

1
$ rdfind -makehardlinks true ~/Downloads

使用符号链接/软链接代替所有重复文件,运行:

1
$ rdfind -makesymlinks true ~/Downloads

目录中有一些空文件,也许你想忽略他们,你可以像下面一样使用 -ignoreempty 选项:

1
$ rdfind -ignoreempty true ~/Downloads

如果你不再想要这些旧文件,删除重复文件,而不是使用硬链接或软链接代替它们。

删除重复文件,就运行:

1
$ rdfind -deleteduplicates true ~/Downloads

如果你不想忽略空文件,并且和所哟重复文件一起删除。运行:

1
$ rdfind -deleteduplicates true -ignoreempty false ~/Downloads

更多细节,参照帮助部分:

手册页:

2. Fdupes

Fdupes 是另一个在指定目录以及子目录中识别和移除重复文件的命令行工具。这是一个使用 C 语言编写的自由开源工具。Fdupes 通过对比文件大小、部分 MD5 签名、全部 MD5 签名,最后执行逐个字节对比校验来识别重复文件。

与 Rdfind 工具类似,Fdupes 附带非常少的选项来执行操作,如:

  • 在目录和子目录中递归的搜索重复文件
  • 从计算中排除空文件和隐藏文件
  • 显示重复文件大小
  • 出现重复文件时立即删除
  • 使用不同的拥有者/组或权限位来排除重复文件
  • 更多

安装 Fdupes

Fdupes 存在于大多数 Linux 发行版的默认仓库中。

在 Arch Linux 和它的变种如 Antergos、Manjaro Linux 上,如下使用 Pacman 安装它。

在 Debian、Ubuntu、Linux Mint 上:

1
$ sudo apt-get install fdupes

在 Fedora 上:

1
$ sudo dnf install fdupes

在 RHEL、CentOS 上:

1
$ sudo yum install epel-release $ sudo yum install fdupes

用法

Fdupes 用法非常简单。仅运行下面的命令就可以在目录中找到重复文件,如:~/Downloads

我系统中的样例输出:

1
/home/sk/Downloads/Hyperledger.pdf /home/sk/Downloads/Hyperledger(1).pdf

你可以看到,在 /home/sk/Downloads/ 目录下有一个重复文件。它仅显示了父级目录中的重复文件。如何显示子目录中的重复文件?像下面一样,使用 -r 选项。

现在你将看到 /home/sk/Downloads/ 目录以及子目录中的重复文件。

Fdupes 也可用来从多个目录中迅速查找重复文件。

1
$ fdupes ~/Downloads ~/Documents/ostechnix

你甚至可以搜索多个目录,递归搜索其中一个目录,如下:

1
$ fdupes ~/Downloads -r ~/Documents/ostechnix

上面的命令将搜索 ~/Downloads 目录,~/Documents/ostechnix 目录和它的子目录中的重复文件。

有时,你可能想要知道一个目录中重复文件的大小。你可以使用 -S 选项,如下:

1
$ fdupes -S ~/Downloads 403635 bytes each: /home/sk/Downloads/Hyperledger.pdf /home/sk/Downloads/Hyperledger(1).pdf

类似的,为了显示父目录和子目录中重复文件的大小,使用 -Sr 选项。

我们可以在计算时分别使用 -n-A 选项排除空白文件以及排除隐藏文件。

1
$ fdupes -n ~/Downloads $ fdupes -A ~/Downloads

在搜索指定目录的重复文件时,第一个命令将排除零长度文件,后面的命令将排除隐藏文件。

汇总重复文件信息,使用 -m 选项。

1
$ fdupes -m ~/Downloads 1 duplicate files (in 1 sets), occupying 403.6 kilobytes

删除所有重复文件,使用 -d 选项。

样例输出:

1
[1] /home/sk/Downloads/Hyperledger Fabric Installation.pdf [2] /home/sk/Downloads/Hyperledger Fabric Installation(1).pdf Set 1 of 1, preserve files [1 - 2, all]:

这个命令将提示你保留还是删除所有其他重复文件。输入任一号码保留相应的文件,并删除剩下的文件。当使用这个选项的时候需要更加注意。如果不小心,你可能会删除原文件。

如果你想要每次保留每个重复文件集合的第一个文件,且无提示的删除其他文件,使用 -dN 选项(不推荐)。

当遇到重复文件时删除它们,使用 -I 标志。

关于 Fdupes 的更多细节,查看帮助部分和 man 页面。

1
$ fdupes --help $ man fdupes

3. FSlint

FSlint 是另外一个查找重复文件的工具,有时我用它去掉 Linux 系统中不需要的重复文件并释放磁盘空间。不像另外两个工具,FSlint 有 GUI 和 CLI 两种模式。因此对于新手来说它更友好。FSlint 不仅仅找出重复文件,也找出坏符号链接、坏名字文件、临时文件、坏的用户 ID、空目录和非精简的二进制文件等等。

安装 FSlint

FSlint 存在于 AUR,因此你可以使用任一 AUR 助手安装它。

在 Debian、Ubuntu、Linux Mint 上:

1
$ sudo apt-get install fslint

在 Fedora 上:

1
$ sudo dnf install fslint

在 RHEL,CentOS 上:

1
$ sudo yum install epel-release $ sudo yum install fslint

一旦安装完成,从菜单或者应用程序启动器启动它。

FSlint GUI 展示如下:

如你所见,FSlint 界面友好、一目了然。在 “Search path” 栏,添加你要扫描的目录路径,点击左下角 “Find” 按钮查找重复文件。验证递归选项可以在目录和子目录中递归的搜索重复文件。FSlint 将快速的扫描给定的目录并列出重复文件。

从列表中选择那些要清理的重复文件,也可以选择 “Save”、“Delete”、“Merge” 和 “Symlink” 操作他们。

在 “Advanced search parameters” 栏,你可以在搜索重复文件的时候指定排除的路径。

FSlint 命令行选项

FSlint 提供下面的 CLI 工具集在你的文件系统中查找重复文件。

  • findup — 查找重复文件
  • findnl — 查找名称规范(有问题的文件名)
  • findu8 — 查找非法的 utf8 编码的文件名
  • findbl — 查找坏链接(有问题的符号链接)
  • findsn — 查找同名文件(可能有冲突的文件名)
  • finded — 查找空目录
  • findid — 查找死用户的文件
  • findns — 查找非精简的可执行文件
  • findrs — 查找文件名中多余的空白
  • findtf — 查找临时文件
  • findul — 查找可能未使用的库
  • zipdir — 回收 ext2 目录项下浪费的空间

所有这些工具位于 /usr/share/fslint/fslint/fslint 下面。

例如,在给定的目录中查找重复文件,运行:

1
$ /usr/share/fslint/fslint/findup ~/Downloads/

类似的,找出空目录命令是:

1
$ /usr/share/fslint/fslint/finded ~/Downloads/

获取每个工具更多细节,例如:findup,运行:

1
$ /usr/share/fslint/fslint/findup --help

关于 FSlint 的更多细节,参照帮助部分和 man 页。

1
$ /usr/share/fslint/fslint/fslint --help $ man fslint

总结

现在你知道在 Linux 中,使用三个工具来查找和删除不需要的重复文件。这三个工具中,我经常使用 Rdfind。这并不意味着其他的两个工具效率低下,因为到目前为止我更喜欢 Rdfind。

作为一名物理学工作者,输入大量的LaTeX公式不可避免,然后为了节省输入时间,以及输入的规范化,本文介绍三个标准的宏包,希望能够为您的工作增效。 具体使用说明,安装Texlive后,请执行:texdoc physics 等。

  • physics The goal of this package is to make typesetting equations for physics simpler, faster, and more human readable. To that end, the commands included in this package have names that make the purpose of each command immediately obvious and remove any ambiguity while reading and editing physics code. From a practical standpoint, it is handy to have a well-defined set of shortcuts for accessing the long-form of each of these commands. The commands listed below are therefore defined in terms of their long-form names and then shown explicitly in terms of the default shorthand command sequences. These shorthand commands are meant make it easy to remember both the shorthand names and what each one represents.

  • physconst This package consists of several macros that are shorthand for a variety of physical constants, e.g. the speed of light. The package developed out of physics and astronomy classes that I have taught and wanted to ensure that I had correct values for each constant and did not wish to retype them every time I use them. The constants can be used in two forms, the most accurate available values, or versions that are rounded to 3 significant digits for use in typical classroom settings, homework assignments, etc.

  • physunits This package consists of several macros that are shorthand for a variety of physical units that are commonly used in introductory level physics and astronomy classes. At present, this package provides some similar units to those in siunitx, but is uses slightly different macro names for each. This package also provides a number of non-SI units (e.g. erg, cm, BTU).

若文章中几处需要添加相同内容的脚注,各自都写\footnote{*}的话,则会出现好几个内容重复的脚注。这个问题可以通过“标签引用”+“上标”来解决。比如我们要给ORLJaffe都添加同样的脚注,可以这样:

1
2
ORL\footnote{http://blog.csdn.net/bear\_kai\label{web}} and
Jaffe\textsuperscript{\ref {web}}.

注意网址中有下划线时,在latex中需要额外加一个反斜杠即“转义字符”。

其他参考:LaTeX 技巧 950:LaTeX 攻略之脚注常用技巧

默认情况下 pip 使用的是国外的镜像,在下载的时候速度非常慢,本文我们介绍使用国内清华大学的源,地址为:

清华地址
1
https://pypi.tuna.tsinghua.edu.cn/simple

我们可以直接在 pip 命令中使用 -i 参数来指定镜像地址,例如:

1
pip3 install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple

以上命令使用清华镜像源安装 numpy 包。这种只对当前安装对命令有用,如果需要全局修改,则需要修改配置文件。

Linux/Mac os 环境中,配置文件位置在 ~/.pip/pip.conf(如果不存在创建该目录和文件):

1
mkdir ~/.pip

打开配置文件 ~/.pip/pip.conf,修改如下:

1
2
3
4
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host = https://pypi.tuna.tsinghua.edu.cn

查看 镜像地址:

1
2
3
$ pip3 config list   
global.index-url='https://pypi.tuna.tsinghua.edu.cn/simple'
install.trusted-host='https://pypi.tuna.tsinghua.edu.cn'

可以看到已经成功修改了镜像。

Windows下,你需要在当前对用户目录下(C:\\Users\\xx\\pip,xx 表示当前使用对用户,比如张三)创建一个 pip.ini在pip.ini文件中输入以下内容:

1
2
3
4
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host = pypi.tuna.tsinghua.edu.cn

其他国内镜像源

trash-cli 用于移动文件到回收站,同时会记录文件的原地址、删除日期和权限。trash-cli 和 KDE、GNOME、XFCE 使用同一个回收站,你可以在命令行或脚本运行 trash-cli。

安装

archlinux
1
sudo pacman -S trash-cli

命令

命令 作用
trash-put 把文件或目录移动到回收站
trash-empty 清空回收站
trash-list 列出回收站文件
trash-restore 恢复回收站文件
trash-rm 删除回收站文件

用法

  • 移动文件到回收站:

    1
    $ trash-put

  • 列出回收站文件:

    1
    2
    3
    4
    $ trash-list
    2008-06-01 10:30:48 /home/andrea/bar
    2008-06-02 21:50:41 /home/andrea/bar
    2008-06-23 21:50:49 /home/andrea/foo

  • 搜索回收站文件:

    1
    2
    3
    $ trash-list | grep foo
    2007-08-30 12:36:00 /home/andrea/foo
    2007-08-30 12:39:41 /home/andrea/foo

  • 恢复回收站文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ trash-restore
    0 2007-08-30 12:36:00 /home/andrea/foo
    1 2007-08-30 12:39:41 /home/andrea/bar
    2 2007-08-30 12:39:41 /home/andrea/bar2
    3 2007-08-30 12:39:41 /home/andrea/foo2
    4 2007-08-30 12:39:41 /home/andrea/foo
    What file to restore [0..4]: 4
    $ ls foo
    foo

  • 删除所有回收站文件:

    1
    $ trash-empty

  • 删除回收站中 n 天前被回收的文件:

    1
    $ trash-empty <days>

  • 示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $ date
    Tue Feb 19 20:26:52 CET 2008
    $ trash-list
    2008-02-19 20:11:34 /home/einar/today
    2008-02-18 20:11:34 /home/einar/yesterday
    2008-02-10 20:11:34 /home/einar/last_week
    $ trash-empty 7
    $ trash-list
    2008-02-19 20:11:34 /home/einar/today
    2008-02-18 20:11:34 /home/einar/yesterday
    $ trash-empty 1
    $ trash-list
    2008-02-19 20:11:34 /home/einar/today

  • 只删除符合某种模式的文件:

    1
    $ trash-rm \*.o

    注意:要用双引号圈住模式来避免 shell 拓展。

常见问题

  • 如何创建顶级 .Trash 目录?

    1
    2
    3
    sudo mkdir --parent /.Trash
    sudo chmod a+rw /.Trash
    sudo chmod +t /.Trash

  • 我能把 rm 的别名设置为 trash-put 吗?

    可以,但不应该这样做。以前我觉得这是个好主意,但现在我不觉得。

    虽然 trash-put 的界面看起来与 rm 兼容,但它们有不同的语法,这些差异会导致一些问题。比如,用 rm 删除目录时需要 -R , trash-put 则不需要。

    但有时候我忘记用 trash-put 了,真的不能给 rm 设置别名吗?

  • 你可以给 rm 设置一个别名来提醒你不要使用它:

    1
    alias rm='echo "This is not the command you are looking for."; false'

  • 如果你真的要用 rm ,那就在 rm 前加上斜杠来取消别名:

    1
    \rm file-without-hope

    注意,Bash 别名是有在交互式界面才有效,所以使用这个别名不会影响使用 rm 的脚本。

  • 被移动到回收站的文件在哪?从 home 分区移动到回收站的文件在这:

    1
    ~/.local/share/Trash/

  • 删除文件test.tex, 直接命令输入

    1
    mv -t ~/.local/share/Trash/files --backup=t test.tex

  • shell中取别名

    ~/.zshrc 或 ~/.bashrc
    1
    alias del='mv -t ~/.local/share/Trash/files --backup=t'

  • 使用rl命令查看回收站的内容

    ~/.zshrc 或 ~/.bashrc
    1
    2
    3
    4
    5
    6
    alias rl='ls ~/.local/share/Trash/files'
    alias ur=undelfile
    undelfile()
    {
    mv -i ~/.local/share/Trash/files/$@ ./
    }

  • 使之立刻生效

    1
    2
    source ~/.zshrc
    source ~/.bashrc

注意:文件~/.zshrc针对zsh配置,~/.bashrc针对bash配置。

01. CupPy 概览

今天我们来聊聊一个在 Python 数据科学领域中日益受到关注的库——CuPy。

什么是 CuPy?

CuPy 是一个开源的 Python 库,它的设计初衷是为了使得在 GPU 上的计算变得简单快捷。

它提供了与 NumPy 非常相似的 API,这意味着如果你已经熟悉 NumPy,那么使用 CuPy 将会非常容易。

CuPy 的亮点在于它能够利用 NVIDIA GPU 来加速计算,这在处理大规模数据时尤其有用。

https://github.com/cupy/cupy

为什么选择 CuPy?

  • 速度提升显著:根据多个来源的数据,CuPy 在某些操作上比 NumPy 快了几十甚至几百倍。这对于数据科学和机器学习等领域的应用来说,意味着更高效的数据处理和分析能力。
  • 易于上手:CuPy 的接口设计遵循 NumPy,这使得那些已经熟悉 NumPy 的用户可以轻松迁移到 CuPy。
  • 广泛的应用场景:从深度学习到图像处理,CuPy 都能提供强大的支持。

安装 CuPy

安装 CuPy 相当简单。你只需要使用 pip 命令:

1
2
3
4
5
6
7
8
9
10
11
# For CUDA 11.2 ~ 11.x
pip install cupy-cuda11x

# For CUDA 12.x
pip install cupy-cuda12x

# For AMD ROCm 4.3
pip install cupy-rocm-4-3

# For AMD ROCm 5.0
pip install cupy-rocm-5-

一个简单的例子

让我们来看一个简单的例子,对比一下 NumPy 和 CuPy 在处理同样任务时的速度差异。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import numpy as np
import cupy as cp
import time

# 使用 NumPy 创建一个大数组
start_time = time.time()
numpy_array = np.random.rand(10000, 10000)
numpy_result = numpy_array ** 2
print("NumPy 时间:", time.time() - start_time)

# 使用 CuPy 完成同样的任务
start_time = time.time()
cupy_array = cp.random.rand(10000, 10000)
cupy_result = cupy_array ** 2
print("CuPy 时间:", time.time() - start_time)

NumPy 时间:3.474796772003174

CuPy 时间:0.0693259145678

在这个例子中,我们创建了一个大型数组,并计算了它的平方。

我们会发现,使用 CuPy 完成同样的任务所需的时间远少于 NumPy,速度提升了 50 倍。

一个更酷的性能对比

创建一个 3D NumPy 数组并执行一些数学函数。time.time()

1
2
3
4
5
6
7
8
9
10
11
import time

# NumPy and CPU Runtime
s = time.time()
x_cpu = np.ones((1000, 100, 1000))
np_result = np.sqrt(np.sum(x_cpu**2, axis=-1))
e = time.time()
np_time = e - s
print("Time consumed by NumPy: ", np_time)

Time consumed by NumPy: 0.5474584102630615

同样,创建一个 3D CuPy 数组,执行数学运算,并为其计时以提高性能。

1
2
3
4
5
6
7
8
9
# CuPy and GPU Runtime
s = time.time()
x_gpu = cp.ones((1000, 100, 1000))
cp_result = cp.sqrt(cp.sum(x_gpu**2, axis=-1))
e = time.time()
cp_time = e - s
print("\nTime consumed by CuPy: ", cp_time)

Time consumed by CuPy: 0.001028299331665039

为了计算差异,我们将 NumPy 时间除以 CuPy 时间

1
2
3
4
diff = np_time/cp_time
print(f'\nCuPy is {diff: .2f} X time faster than NumPy')

CuPy is 532.39 X time faster than NumPy

在使用 CuPy 时,我们似乎获得了超过 500 倍的性能提升

02. 使用示例

CuPy 的基础知识

在本节中,我们将比较 CuPy 和 Numpy 的语法,它们有 95% 的相似度。

  • 首先使用 Python 列表创建一个 NumPy 和 CuPy 数组,之后我们将计算向量的范数。
1
2
3
4
5
6
7
8
9
10
import cupy as cp
import numpy as np
x = [3, 4, 5]
x_np = np.array(x)
x_cp = cp.array(x)
l2_np = np.linalg.norm(x_np)
l2_cp = cp.linalg.norm(x_cp)
print("Numpy: ", l2_np)
print("Cupy: ", l2_cp

正如我们所看到的,我们得到了类似的结果。

1
2
Numpy:  7.0710678118654755
Cupy: 7.0710678118654755
  • 要将 NumPy 转换为 CuPy 数组,只需使用 .cp.asarray(X)
1
2
3
x_array = np.array([10, 22, 30])
x_cp_array = cp.asarray(x_array)
type(x_cp_array)

cupy.ndarray

  • 或者,使用 将 CuPy 转换为 Numpy 数组。.get()
1
2
x_np_array = x_cp_array.get()
type(x_np_array)

numpy.ndarray

CuPy 高级应用示例

  • 图像处理:边缘检测

图像处理是 CuPy 的一个重要应用领域。以下是一个使用 CuPy 进行边缘检测的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import cupy as cp
import cv2

def edge_detection(image_path):
# 读取图像
image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
image_gpu = cp.asarray(image)

# Sobel 边缘检测算子
sobel_x = cp.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]], dtype=cp.float32)
sobel_y = cp.array([[-1, -2, -1], [0, 0, 0], [1, 2, 1]], dtype=cp.float32)

# 应用算子
edge_x = cp.abs(cp.signal.convolve2d(image_gpu, sobel_x, mode='same'))
edge_y = cp.abs(cp.signal.convolve2d(image_gpu, sobel_y, mode='same'))

# 合并边缘
edge = cp.sqrt(cp.square(edge_x) + cp.square(edge_y))

# 将结果转换回 CPU 并显示
result = cp.asnumpy(edge)
cv2.imshow('Edge Detection', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

# 使用示例
edge_detection('path_to_your_image.jpg')

这个示例展示了如何使用 CuPy 在 GPU 上进行图像的边缘检测,这对于图像分析和计算机视觉应用非常有用。

  • 大规模数据运算:矩阵乘法

CuPy 在处理大规模数据运算时表现出色。下面是一个矩阵乘法的示例:

1
2
3
4
5
6
7
8
9
10
11
12
import cupy as cp
import time

# 创建大型随机矩阵
a_gpu = cp.random.rand(10000, 10000)
b_gpu = cp.random.rand(10000, 10000)

# 执行矩阵乘法
start_time = time.time()
c_gpu = cp.dot(a_gpu, b_gpu)
cp.cuda.Stream.null.synchronize() # 确保计算完成
print("CuPy 矩阵乘法时间:", time.time() - start_time)

这个示例展示了 CuPy 在执行大规模矩阵乘法时的高效性,这对于科学计算和数据分析尤其重要。

  • 深度学习:简单的神经网络

CuPy 也可以用于构建和训练简单的神经网络。以下是一个示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import cupy as cp

def sigmoid(x):
return 1 / (1 + cp.exp(-x))

# 随机初始化权重
weights = cp.random.rand(3, 1)

# 示例输入
inputs = cp.array([[1, 0, 1],
[1, 1, 1],
[0, 0, 1]])

# 前向传播
outputs = sigmoid(cp.dot(inputs, weights))

print(outputs)

这个示例展示了如何使用 CuPy 进行简单的神经网络前向传播计算。

以上示例展示了 CuPy 在不同领域的应用,包括图像处理、大规模数据运算和深度学习。

03. Numpy、Cupy 和 Pytorch

CuPy 和 NumPy 之间的区别

别问我有什么区别,问就是几乎一样样。实在要知道到底有什么区别,参考Differences between CuPy and NumPy

Cupy 与 Numpy 互转

1
2
3
4
5
6
7
8
import cupy as cp
import numpy as np

# cupy->numpy
numpy_data = cp.asnumpy(cupy_data)

# numpy->cupy
cupy_data = cp.asarray(numpy_data)

Cupy 与 Pytorch 互转

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 需借助中间库 dlpack
# cupy.array<–>Dlpack.Tensor<–>torch.Tensor

from cupy.core.dlpack import toDlpack
from cupy.core.dlpack import fromDlpack
from torch.utils.dlpack import to_dlpack
from torch.utils.dlpack import from_dlpack
import torch

# pytorch->cupy
cupy_data = fromDlpack(to_dlpack(tensor_data))

# cupy->pytorch
tensor_data = from_dlpack(toDlpack(cupy_data)

Numpy 与 Pytorch 互转

1
2
3
4
5
6
7
8
import numpy as np
import torch

# pytorch->numpy
numpy_data = tensor_data.numpy()

# numpy->pytorch
tensor_data = torch.from_numpy(numpy_data)

抱个拳 总个结

Beyond NumPy

让我们以一张表结束:最快的 CPU VS 最快的 GPU。

CuPy 是一个强大的工具,它能够显著提高数据处理的速度。

对于那些希望在数据科学和机器学习领域进一步提升效率的朋友们,CuPy 绝对值得一试。

diary.sh 开发说明

自从网易、新浪等博客网站关闭后,我决定使用 HexoGithubGiteeGitlab 等代码托管平台,借助其 Pages 功能来部署自己的博客。但是每次都使用 Hexo 的标准命令进行操作,步骤上确实很繁琐。随着时间的推移,博客内容越来越多,于是就需要一个能够管理博客并方便发布博客的工具。为了达成这个目标,diary.sh 应运而生!这个脚本一直作为我的私人程序使用,但由于前期编写 Shell 代码的水平有限,使得脚本的通用性不佳,同时一些功能的实现也不太理想。在熟练掌握 Shell 后,我改进了程序,推出了通用版本,并将版本号升级为 V8.0。在新版中,个人信息将以配置文件的形式由作者自行填写,脚本中不再保留任何个人信息。

简明信息

diary.sh
1
2
3
4
5
6
7
# Program  : diary.sh
# Author : fengzhenhua
# Email : fengzhenhua@outlook.com
# CopyRight: Copyright (C) 2022-2025 FengZhenhua(冯振华)
# License : Distributed under terms of the MIT license.
# History : 2024年04月20日, 升级了菜单选择系统,同时去除个人信息写在脚本中的问题,使diary.sh成为通用程序
# 2024年04月22日, 修改COMMENT为主板名,可以识别出发布博客的机器,比使用主机名更可靠升级V8.3

安装

Install diary.sh
1
2
sudo curl -o /usr/local/bin/diary https://gitlab.com/fengzhenhua/script/-/raw/usbmain/diary.sh\?inline\=false 
sudo chmod +x /usr/local/bin/diary

使用方法: diary -h 获取帮助。

发布仓库

已经脚本程序分别发布于gitlabgitee, 请您自行前往下载:

可用脚本为:

脚本 作用
arcsetup.sh 配置ArchLinux
diary.sh 管理GitLab博客
ugit.sh U盘仓库管理, 单U盘版
neougit.sh U盘仓库管理, 多U盘版
updatehost.sh 升级host访问github
translatorGD.py Goldendict 添加网络翻译