问题描述在使用numpy将list转为array的时候报错代码a = np.array([[1,2],[3,4]])b = np.array([[5,6,7],[8,9,10]])c = [a,b]d = np.array(c)
时间: 2024-09-09 20:12:06 浏览: 42
当你试图使用 `np.array()` 将包含其他数组的列表转换为单个数组时,可能会遇到错误。在这个例子中,`c = [a, b]` 创建了一个包含两个数组 `a` 和 `b` 的列表。`d = np.array(c)` 正确地尝试将这个列表转换成一个二维数组,但这并不总是可行,特别是如果这些数组在维度上不匹配。
例如,`a` 和 `b` 都是形状为 (2, 2) 的数组,但是 `c` 中的元素不是同一维度,这使得 `np.array(c)` 无法直接创建一个单一的数组,因为 `np.array` 默认期望所有的输入都是同构的(即形状和数据类型的相同)。
解决这个问题的一种方法是先将列表中的每个元素展平(如果需要),然后合并它们。如果你想要保持嵌套结构,可以考虑使用 `np.stack` 或 `np.concatenate`,或者创建一个多维数组来存储每个数组作为独立的一维数组:
```python
# 如果你想保持嵌套结构
flat_c = [arr.flatten() for arr in c]
d = np.stack(flat_c)
# 或者展开并堆叠所有元素
d = np.concatenate([arr.reshape(-1, 1) for arr in c])
相关问题
import numpy as np import pickle f = open(r'C:\Users\sdnugeo\Desktop\target2.pkl','rb') bi = pickle.load(f) # bi = np.array(bi) data = np.arange(0, 156) print(data) data = data.tolist() # print(data) # 每次抽取1000个数值,共抽取10次 samples = [] c = [] for i in range(11): if len(data) > 15: sample = np.random.choice(data, 15, replace=False) else: sample = np.random.choice(data, 6, replace=False) # continue # print(type(sample)) # sample2 = np.array(sample) b = [bi[j] for j in list(sample)] # d = np.array(b) print(type(b)) c.append(b) # c = bi[0] print(sample) print(b) samples.append(sample) # sample = [s for s in sample if s in data] for s in sample: data.remove(s) samples = np.array(samples).reshape(-1) print(samples) print(data),报错setting an array element with a sequence. The requested array has an inhomogeneous shape after 1 dimensions. The detected shape was (11,) + inhomogeneous part.
这个报错可能是因为你最后将 `samples` 转换成了 NumPy 数组,而 `samples` 中的元素是列表而非数值,导致形状不均匀。你可以将 `samples` 中的元素先转换成 NumPy 数组,再将整个 `samples` 数组转换成一维数组,如下所示:
```python
samples = [np.array(s) for s in samples]
samples = np.concatenate(samples, axis=0)
```
这样就可以将 `samples` 转换成一维的 NumPy 数组。另外,你在循环中的最后一次循环中没有把 `sample` 中的元素移除 `data` 中,可能会导致后续的循环中重复抽取相同的元素。你可以将最后一次循环中的 `for` 循环移到 `if` 语句的内部,这样就可以确保每次循环都会将 `sample` 中的元素从 `data` 中移除。
import numpy as np import pickle import math f = open(r'C:\Users\sdnugeo\Desktop\target2.pkl','rb') bi = pickle.load(f) # bi = np.array(bi) data = np.arange(0, 156) print(data) data = data.tolist() # print(data) # 每次抽取1000个数值,共抽取10次 samples = [] c = [] a = 11 r = math.ceil(len(data)/a) print(r) for i in range(a): if len(data) > r : sample = np.random.choice(data, r, replace=False) else: sample = np.random.choice(data, len(data), replace=False) # for s in sample: # data.remove(s) # continue # print(type(sample)) # sample2 = np.array(sample) b = [bi[j] for j in list(sample)] # d = np.array(b) print(type(b)) c.append(b) # c = np.concatenate(c, axis=0) # c = bi[0] print(sample) # print(b) samples.append(sample) for s in sample: data.remove(s) # sample = [s for s in sample if s in data] samples = [np.array(s) for s in samples] samples = np.concatenate(samples, axis=0) c = [np.array(e) for e in c] c = np.concatenate(c, axis=0) # samples = np.array(samples).reshape(-1) print(samples) print(c.shape) 请帮我把这段代码修改成可调用的函数
好的,你想要将这段代码封装成一个函数,可以尝试以下的实现:
```python
import numpy as np
import pickle
import math
def sample_data(filepath):
f = open(filepath, 'rb')
bi = pickle.load(f)
data = np.arange(0, 156)
data = data.tolist()
samples = []
c = []
a = 11
r = math.ceil(len(data)/a)
for i in range(a):
if len(data) > r:
sample = np.random.choice(data, r, replace=False)
else:
sample = np.random.choice(data, len(data), replace=False)
b = [bi[j] for j in list(sample)]
c.append(b)
samples.append(sample)
for s in sample:
data.remove(s)
samples = [np.array(s) for s in samples]
samples = np.concatenate(samples, axis=0)
c = [np.array(e) for e in c]
c = np.concatenate(c, axis=0)
return samples, c
```
你可以将这个函数保存在一个.py文件中,然后在其他的python文件中,通过import导入并调用该函数。调用方法如下:
```python
from your_module import sample_data
filepath = r'C:\Users\sdnugeo\Desktop\target2.pkl'
samples, c = sample_data(filepath)
```
其中,filepath是你想要读取的pickle文件的路径。函数返回两个变量,分别为samples和c。
阅读全文