numpy index slicing 数组的切片和索引 numpy数组初恋

之前numpy 数组创建的文章中我们介绍了数组的创建入门,本篇我们旨在简单介绍数组的基本操作–定向定点的取值,ndarray对象的内容可以通过索引或切片来访问和修改,与 Python 中 list 的切片操作一样。

ndarray 数组可以基于 0 – n 的下标进行索引,切片对象可以通过内置的 slice 函数,并设置 start, stop 及 step 参数进行,从原数组中切割出一个新数组。

基本索引

    # 一维数组切片
    a = np.arange(10)
    s = slice(2, 7, 2)  # 从索引 2 开始到索引 7 停止,间隔为2
    print("a = ", a)
    print("s = slice(2, 7, 2) # 从索引 2 开始到索引 7 停止,间隔为2")
    print("a[s] = ", a[s])
    print("a[2:7:2] = ", a[2:7:2])
    print("a[2:7] = ", a[2:7])
    print("a[2:] = ", a[2:] )
    print("a[2] = ", a[2])
a =  [0 1 2 3 4 5 6 7 8 9]
s = slice(2, 7, 2) # 从索引 2 开始到索引 7 停止,间隔为2
a[s] =  [2 4 6]
a[2:7:2] =  [2 4 6]
a[2:7] =  [2 3 4 5 6]
a[2:] =  [2 3 4 5 6 7 8 9]
a[2] =  2
    # 多维数组
    a = np.array([[1, 2, 3], [3, 4, 5], [4, 5, 6]])
    print("a = ", a)
    print("a[::-1] = ", a[::-1])
    print("a[:, ::-1] = ", a[:, ::-1])
    print("a[...,1] = ", a[..., 1])
    print("a[1,...] = ", a[1, ...])
    print("a[...,1:] = ", a[..., 1:])
a =  [[1 2 3]
 [3 4 5]
 [4 5 6]]
a[::-1] =  [[4 5 6]
 [3 4 5]
 [1 2 3]]
a[:, ::-1] =  [[3 2 1]
 [5 4 3]
 [6 5 4]]
a[...,1] =  [2 4 5]
a[1,...] =  [3 4 5]
a[...,1:] =  [[2 3]

花里胡哨索引

    # 数组索引
    print("a[[0, 1, 2], [0, 1, 0]] =", a[[0, 1, 2], [0, 1, 0]])
    x = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]])
    print('我们的数组是x:', x)
    rows = np.array([[0, 0], [3, 3]])
    cols = np.array([[0, 2], [0, 2]])
    print("x[rows, cols] = ", x[rows, cols])
    # 布尔索引
    print("x[x > 3] = ", x[x> 3])
a[[0, 1, 2], [0, 1, 0]] = [1 4 4]
我们的数组是x: [[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]
x[rows, cols] =  [[ 0  2]
 [ 9 11]]
x[x > 3] =  [ 4  5  6  7  8  9 10 11]

linux tmux 终端复用神器 走过路过不要错过

tmux是一个优秀的终端复用软件,即使非正常掉线,也能保证当前的任务运行,这一点对于远程SSH访问特别有用。例如我们正在linux环境中编写代码或者查看某个文件, 突然断网了,代码没有报错文件没有关闭,等我们再打开linux连接的时候发现代码不见,文件乱了。

简单地说,tmux对于我主要有三个功能:

  1. split窗口。可以在一个terminal下打开多个终端,也可以对当前屏幕进行各种split,即可以 同时打开多个显示范围更小的终端。
  2. 在使用SSH的环境下,避免网络不稳定,导致工作现场的丢失。
  3. 装*(这是我说的)

安装

centos系统: sudo yum install tmux
Ubuntu系统: sudo apt-get install tmux

基础概念

server服务器。输入tmux命令时就开启了一个服务器。
session会话。一个服务器可以包含多个会话。
window窗口。一个会话可以包含多个窗口。
pane面板。一个窗口可以包含多个面板。
tmux顶层概念

操作

Ctrl+d激活控制台;此时以下按键生效
系统操作?列出所有快捷键;按q返回
d脱离当前会话;这样可以暂时返回Shell界面,输入tmux attach能够重新进入之前的会话
D选择要脱离的会话;在同时开启了多个会话时使用
Ctrl+z挂起当前会话
r强制重绘未脱离的会话
s选择并切换会话;在同时开启了多个会话时使用
:进入命令行模式;此时可以输入支持的命令,例如kill-server可以关闭服务器
[进入复制模式;此时的操作与vi/emacs相同,按q/Esc退出
~列出提示信息缓存;其中包含了之前tmux返回的各种提示信息
窗口操作c创建新窗口
&关闭当前窗口
数字键切换至指定窗口
p切换至上一窗口
n切换至下一窗口
l在前后两个窗口间互相切换
w通过窗口列表切换窗口
,重命名当前窗口;这样便于识别
.修改当前窗口编号;相当于窗口重新排序
f在所有窗口中查找指定文本
面板操作将当前面板平分为上下两块
%将当前面板平分为左右两块
x关闭当前面板
!将当前面板置于新窗口;即新建一个窗口,其中仅包含当前面板
Ctrl+方向键以1个单元格为单位移动边缘以调整当前面板大小
Alt+方向键以5个单元格为单位移动边缘以调整当前面板大小
Space在预置的面板布局中循环切换;依次包括even-horizontal、even-vertical、main-horizontal、main-vertical、tiled
q显示面板编号
o在当前窗口中选择下一面板
方向键移动光标以选择面板
{向前置换当前面板
}向后置换当前面板
Alt+o逆时针旋转当前窗口的面板
Ctrl+o顺时针旋转当前窗口的面板
tmux使用键盘操作,常用快捷键

配置

tmux的系统级配置文件为/etc/tmux.conf,用户级配置文件为~/.tmux.conf。

一般我们使用时都是用的用户级,在linux session窗体输入命令: cd 回车。

再输入命令: ls -thla 回车,看一下有没有一个文件 .tmux.conf。

如果不存在.tmux.conf ,则直接touch .tmux.conf 或者 vim .tmux.conf, 在文件中增加以下内容(笔者使用多年,耐用配置),改完后按 esc键进入命令模式,再输入 (:wq)保存退出。

# 取消crtl + b 的前缀命令
unbind C-b
# 设置ctrl + a 位前缀命令
set -g prefix C-a
setw -g mode-keys vi
#水平或垂直分割窗口 (C+A+ :split-window + v/h)
unbind '"'
bind v splitw -v #分割成上下两个窗口
unbind %
bind h splitw -h #分割成左右两个窗口
#up
bind-key k select-pane -U
#down
bind-key j select-pane -D
#left
bind-key i select-pane -L
#right
bind-key l select-pane -R
bind r source ~/.tmux.conf \; display "Configuration reloaded!"

# resize pane
bind -r ^k resizep -U 10 # upward (prefix Ctrl+k)
bind -r ^j resizep -D 10 # downward (prefix Ctrl+j)
bind -r ^i resizep -L 10 # to the left (prefix Ctrl+h)
bind -r ^l resizep -R 10 # to the right (prefix Ctrl+l)

至此,在linux session窗口输入 tmux命令,然后回车(如下图),就可以开始浪了。

tmux入口

比如按我们的配置来说,进入到tmux 端口后,按键盘的 ctrl +a 松手的同事按下 h键, 则屏幕就会被分成左右两个。

linux top 基本入门命令 VIRT,RES,SHR,DATA的含义

常在linux系统下玩,这是必须掌握的命令之一–top命令,它是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.

输入top后看到的界面

1、内容介绍

PID 进程id
PPID 父进程id
RUSER Real user name
UID 进程所有者的用户id
USER 进程所有者的用户名
GROUP 进程所有者的组名
TTY 启动进程的终端名。不是从终端启动的进程则显示为 ?
PR 优先级
NI nice值。负值表示高优先级,正值表示低优先级
P 最后使用的CPU,仅在多CPU环境下有意义
%CPU 上次更新到现在的CPU时间占用百分比
TIME 进程使用的CPU时间总计,单位秒
TIME+ 进程使用的CPU时间总计,单位1/100秒
%MEM 进程使用的物理内存百分比
VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
SWAP 进程使用的虚拟内存中,被换出的大小,单位kb。
RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
CODE 可执行代码占用的物理内存大小,单位kb
DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
SHR 共享内存大小,单位kb
nFLT 页面错误次数
nDRT 最后一次写入到现在,被修改过的页面数。
S 进程状态。(D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程)
COMMAND 命令名/命令行
WCHAN 若该进程在睡眠,则显示睡眠中的系统函数名
Flags 任务标志,参考 sched.h

2、基本概念

VIRT:virtual memory usage 虚拟内存
1、进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据等
2、假如进程申请100m的内存,但实际只使用了10m,那么它会增长100m,而不是实际的使用量

RES:resident memory usage 常驻内存
1、进程当前使用的内存大小,但不包括swap out
2、包含其他进程的共享
3、如果申请100m的内存,实际使用10m,它只增长10m,与VIRT相反
4、关于库占用内存的情况,它只统计加载的库文件所占内存大小

SHR:shared memory 共享内存
1、除了自身进程的共享内存,也包括其他进程的共享内存
2、虽然进程只使用了几个共享库的函数,但它包含了整个共享库的大小
3、计算某个进程所占的物理内存大小公式:RES – SHR
4、swap out后,它将会降下来

DATA
1、数据占用的内存。如果top没有显示,按f键可以显示出来。
2、真正的该程序要求的数据空间,是真正在运行中要使用的。

3、基本命令操作

top 运行中可以通过 top 的内部命令对进程的显示方式进行控制。内部命令如下:
s – 改变画面更新频率
l – 关闭或开启第一部分第一行 top 信息的表示
t – 关闭或开启第一部分第二行 Tasks 和第三行 Cpus 信息的表示
m – 关闭或开启第一部分第四行 Mem 和 第五行 Swap 信息的表示
N – 以 PID 的大小的顺序排列表示进程列表
P – 以 CPU 占用率大小的顺序排列进程列表
M – 以内存占用率大小的顺序排列进程列表
h – 显示帮助
n – 设置在进程列表所显示进程的数量
q – 退出 top
s – 改变画面更新周期