t = np.arange(24).reshape(4,6).astype("float") t[1,3:] = np.nan print(t) # 需求:利⽤ nan 所在列的均值来填充 nan -- (3+15+21)/3
时间: 2024-10-16 11:09:24 浏览: 21
这段代码首先创建了一个二维数组`t`,它由24个元素组成,排列成4行6列,并将所有元素转换为浮点数类型。然后,它将`t`数组的第2行从索引3开始的所有元素设置为`np.nan`,即缺失值。
接下来,`print(t)`会打印出更新后的数组`t`,其中第2行的部分位置显示为NaN。
需求是利用包含NaN所在的每一列(即除第一列外的其他五列),计算并用该列的平均值(mean)替换对应的NaN值。按照这个需求,我们可以这样做:
1. 计算每列的非NaN值平均值
2. 使用这些平均值填充原始数组相应位置的NaN
以下是Python操作:
```python
# 获取非NaN列的平均值
column_means = t.mean(axis=1, skipna=True)[1:]
# 使用平均值填充NaN
t[np.isnan(t)] = column_means[t.isnan().flatten()]
print(t)
```
这里我们先计算了第2行之后各列的平均值(`axis=1`表示按列计算,`skipna=True`跳过NaN),然后用`numpy.where()`函数找到了所有NaN的位置,并用相应的列均值进行填充。
相关问题
digits = cv2.imread('digits.png', 0) rows, cols = np.hsplit(digits, 100) cells = [np.hsplit(row, 50) for row in rows] train_data = np.array(cells).reshape(-1, 400).astype(np.float32) train_labels = np.repeat(np.arange(10), len(train_data) / 10)
这段代码看起来是在做什么?
它是在加载一个包含数字图像的 png 文件,并将每个数字图像分别分割为 50x20 个小单元格。然后,这些小单元格被重新排列成一个数组,其中每个数字被转换为一个 400 维的特征向量,用于训练机器学习模型。每个数字的标签随后被重复多次,并用于训练模型的分类任务。
import numpy as np import math import tensorflow as tf import matplotlib.pyplot as plt # 生成数据 dataset = [] for data in np.arange(0, 3, .01): data = math.sin(data * math.pi) dataset.append(data) dataset = np.array(dataset) dataset = dataset.astype('float32') max_value = np.max(dataset) min_value = np.min(dataset) scalar = max_value - min_value dataset = list(map(lambda x: x / scalar, dataset)) # 创建数据集 look_back = 5 trainX, trainY = [], [] for i in range(len(dataset) - look_back): trainX.append(dataset[i:i+look_back]) trainY.append(dataset[i+look_back]) trainX = np.array(trainX) trainY = np.array(trainY) # 转换为张量 trainX = tf.convert_to_tensor(trainX) trainY = tf.convert_to_tensor(trainY) # 定义模型 model = tf.keras.Sequential([ tf.keras.layers.SimpleRNN(32, input_shape=(look_back, 1)), tf.keras.layers.Dense(1) ]) # 编译模型 model.compile(optimizer=tf.keras.optimizers.Adam(), loss=tf.keras.losses.MeanSquaredError()) # 训练模型 history = model.fit(trainX, trainY, epochs=100, batch_size=16, verbose=2) # 预测结果 predicted = [] for i in range(len(dataset) - look_back): x = np.array(dataset[i:i+look_back]) x = np.reshape(x, (1, look_back, 1)) y = model.predict(x) predicted.append(y[0][0]) # 反归一化 predicted = np.array(predicted) predicted = predicted * scalar # 绘图 plt.plot(dataset[look_back:], label='True Data') plt.plot(predicted, label='Predicted Data') plt.legend() plt.show()生成的真实值只有一半大小
根据您提供的代码,我猜测您可能是在对预测结果进行反归一化时出现了问题。在代码中,您将预测结果乘以了一个名为scalar的标量值,但是scalar的计算方式并没有给出。如果scalar的计算方式不正确,可能导致反归一化后的预测结果不准确。
另外,您在代码中没有给出任何关于预测结果大小的具体描述。如果您说生成的真实值只有一半大小,可能需要更多上下文信息才能理解您的意思。
阅读全文