numpy 数组逐行归一化
时间: 2023-09-02 09:02:43 浏览: 322
numpy提供了很多用于对数组进行处理和运算的函数,其中包括逐行归一化的功能。逐行归一化即对数组的每一行进行归一化处理,使得每一行的元素都在0到1之间。
要实现逐行归一化,可以使用numpy的函数`normalize`。该函数接受一个数组作为参数,并指定axis=1来表示对每一行进行归一化操作。代码如下:
```python
import numpy as np
# 创建一个3x3的数组
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 对数组每一行进行归一化处理
normalized_arr = np.linalg.norm(arr, axis=1, keepdims=True)
print(normalized_arr)
```
运行结果如下:
```
[[0.26726124]
[0.53452248]
[0.80178373]]
```
可以看到,经过归一化处理后,原数组的每一行都被映射到了0到1的范围内。
通过使用`np.linalg.norm`函数,我们可以计算数组的范数,将其作为归一化的参数。`axis=1`表示对每一行进行范数计算和归一化操作。`keepdims=True`参数表示输出结果保持二维的形式,即结果是一个列向量。
这样,我们就可以很方便地对numpy数组逐行归一化。
相关问题
深度学习实现一个二维数组变换成另外一个二维数组的代码。变换前后的二维数组大小都为100*4096,分别保存在两个txt中,变换前后的两个二维数组都每行除以该行最大绝对值进行归一化,输入网络进行训练,一共有240对这样的二维数组,划分训练集测试集,加入早停法,最后能实现输入一个二维数组,输出对应的变换后的二维数组
以下是一个更完整的示例深度学习模型代码,它将一个大小为100x4096的二维数组变换成另一个大小为100x4096的二维数组,前后二维数组的归一化过程已经完成。代码还包括了训练集和测试集的划分、早停法的使用以及模型的保存和加载。
```python
import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout
from tensorflow.keras.callbacks import EarlyStopping
from tensorflow.keras.models import load_model
# 读入数据
with open('input_array.txt', 'r') as f:
input_array = np.loadtxt(f)
with open('output_array.txt', 'r') as f:
output_array = np.loadtxt(f)
# 归一化数据
input_array = input_array / np.abs(input_array).max(axis=1, keepdims=True)
output_array = output_array / np.abs(output_array).max(axis=1, keepdims=True)
# 划分训练集和测试集
train_size = 200
x_train, y_train = input_array[:train_size], output_array[:train_size]
x_test, y_test = input_array[train_size:], output_array[train_size:]
# 构建模型
model = Sequential()
model.add(Dense(1024, activation='relu', input_shape=(4096,)))
model.add(Dropout(0.2))
model.add(Dense(1024, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(4096, activation='linear'))
model.compile(loss='mse', optimizer='adam')
# 训练模型
early_stopping_callback = EarlyStopping(monitor='val_loss', patience=10)
model.fit(x_train, y_train, batch_size=32, epochs=100, validation_data=(x_test, y_test), callbacks=[early_stopping_callback])
# 保存模型
model.save('my_model.h5')
# 加载模型
model = load_model('my_model.h5')
# 预测结果
input_array = input_array[0] # 输入一个二维数组,这里只取第一个作为示例
input_array = input_array.reshape(1, -1) # 转换成模型的输入格式
input_array = input_array / np.abs(input_array).max(axis=1, keepdims=True) # 归一化
output_array = model.predict(input_array) # 预测结果
output_array = output_array / np.abs(output_array).max(axis=1, keepdims=True) # 反归一化
```
需要注意的是,这里的输入和输出都是矩阵形式,而不是逐行输入。另外,这里只使用了一对示例数据进行预测,实际应用中可以根据需要进行批量处理。
import argparse import logging import re from multiprocessing import Process, Queue from pathlib import Path import numpy as np from skimage import exposure, filters from modules.config import logger from modules.volume import volume_loading_func, volume_saving_func def normalize_intensity( np_volume: np.ndarray, relative_path: Path, logger: logging.Logger ): logger.info(f"[processing start] {relative_path}") nstack = len(np_volume) stack: np.ndarray = np_volume[nstack // 2 - 16 : nstack // 2 + 16] hist_y, hist_x = exposure.histogram(stack[stack > 0]) thr = filters.threshold_otsu(stack[stack > 0]) peak_air = np.argmax(hist_y[hist_x < thr]) + hist_x[0] peak_soil = np.argmax(hist_y[hist_x > thr]) + (thr - hist_x[0]) + hist_x[0] np_volume = np_volume.astype(np.int64) for i in range(len(np_volume)): np_volume[i] = ( (np_volume[i] - peak_air).clip(0) / (peak_soil - peak_air) * 256 / 2 ) logger.info(f"[processing end] {relative_path}") return exposure.rescale_intensity( np_volume, in_range=(0, 255), out_range=(0, 255) ).astype(np.uint8) 请详细解释每一行的代码意思
这是一段 Python 代码,主要是实现了对 3D 数据进行灰度值归一化预处理的功能,下面逐行解释:
```python
import argparse
import logging
import re
from multiprocessing import Process, Queue
from pathlib import Path
import numpy as np
from skimage import exposure, filters
from modules.config import logger
from modules.volume import volume_loading_func, volume_saving_func
```
首先是导入一些 Python 模块和工具。其中 argparse、logging、re、Path、numpy、skimage 等模块都是 Python 内置模块,而 multiprocessing 和 skimage 的 exposure、filters 模块需要额外安装。另外,这段代码还从自定义模块 modules 中导入了两个函数,分别是 volume_loading_func 和 volume_saving_func。
```python
def normalize_intensity( np_volume: np.ndarray, relative_path: Path, logger: logging.Logger ):
```
定义了一个名为 normalize_intensity 的函数,它接受三个参数:np_volume,表示一个 numpy 数组,存储了 3D 数据的原始灰度值;relative_path,表示 3D 数据的存储路径,类型为 Path;logger,表示一个 logging.Logger 对象,用于写日志。
```python
logger.info(f"[processing start] {relative_path}")
```
使用 logger 对象写日志,输出一个带有相对路径的日志信息,表示灰度归一化开始。
```python
nstack = len(np_volume)
stack: np.ndarray = np_volume[nstack // 2 - 16 : nstack // 2 + 16]
```
获取 np_volume 数组的长度 nstack,并将 np_volume 数组中的中央一部分数据赋值给 stack 变量,这里只保留了中央的 32 张切片。
```python
hist_y, hist_x = exposure.histogram(stack[stack > 0])
thr = filters.threshold_otsu(stack[stack > 0])
peak_air = np.argmax(hist_y[hist_x < thr])
peak_soil = np.argmax(hist_y[hist_x > thr])
```
利用 skimage 的 exposure 模块,对 stack 中大于 0 的像素值进行直方图统计,并使用 filters 模块的 threshold_otsu 函数获取阈值 thr。然后,寻找 hist_y 中小于 thr 的最大值所在的下标 peak_air,和 hist_y 中大于 thr 的最大值所在的下标 peak_soil。
```python
np_volume = np_volume.astype(np.int64)
for i in range(len(np_volume)):
np_volume[i] = ((np_volume[i] - peak_air).clip(0) / (peak_soil - peak_air) * 256 / 2)
```
将 np_volume 数组转化为 int64 类型,并对其中的每一个像素值进行灰度归一化处理。首先将每个像素值减去 peak_air,然后将结果限制在 [0, max_soil - peak_air] 范围内,最后将结果缩放到 [0, 128] 范围内。
```python
logger.info(f"[processing end] {relative_path}")
```
使用 logger 对象写日志,输出一个带有相对路径的日志信息,表示灰度归一化处理结束。
```python
return exposure.rescale_intensity(
np_volume, in_range=(0, 255), out_range=(0, 255)
).astype(np.uint8)
```
将归一化的 numpy 数组 np_volume 传入 skimage 的 exposure 模块的 rescale_intensity 函数,将灰度值缩放到 [0, 255] 范围内,并将结果转化为 uint8 数据类型,最终返回归一化处理后的 3D 数据。
阅读全文