python 创建类cell数组

 

When you do this:

a = np.array([[np.array([[2, 2]]), np.array([[3, 3]])]])
  • 1

the final call to np.array actually concatenates the inner two, so you get one array at the end:

>>> a
array([[[[2, 2]],

        [[3, 3]]]])

>>> a.shape
(1, 2, 1, 2)

But to mimic a cell array you want to basically have an array of arrays. You can acheive this by setting dtype=object, but you must create the array and set the elements separately to avoid the automatic merging.

three = array([[array([[2, 2, 2]]), array([[3, 3]])]])
two = np.empty(three.shape, dtype=object)
two[0,0,0] = np.array([[2,2]])
two[0,1,0] = np.array([[3,3]])
  •  

Then:

sio.savemat('two.mat', {'two': two})
  •  

to see what they look like:

>>> two
array([[[array([[2, 2]])],
        [array([[3, 3]])]]], dtype=object)

>>> two.shape
(1, 2, 1)
  •  

Note that I may have gotten confused about your desired shape, since you have so many nested brackets, so you might have to reshape some of this, but the idea should hold regardless.

例如:

npose = 5
nsmile = 2

poseSmile_cell = np.empty((npose,nsmile),dtype=object)

for i in range(5):
    for k in range(2):
        poseSmile_cell[i,k] = np.zeros((4,4))


print poseSmile_cell.shape
<think>我们之前已经讨论过如何将3x3矩阵按行转换为3x1的矩阵(每个元素是原矩阵的一行)并存储在cell数组(MATLAB)或对象数组/列表(Python)中。现在,用户的问题是:在转换后,如何使用这些cell数组(或似结构)进行操作? 根据用户提供的引用,我们主要关注MATLAB中cell数组的用法,因为用户特别提到了cell数组。同时,我们也会简要提及Python中的操作。 目标:将3x3矩阵按行转换为3x1的cell数组(MATLAB)或似结构(Python),然后进行一些常见操作。 假设我们已经完成了转换,得到如下结构(以MATLAB为例): A = [1,2,3; 4,5,6; 7,8,9]; B = {A(1,:); A(2,:); A(3,:)}; 则B是一个3x1的cell数组,每个cell包含一个行向量。 接下来,我们将讨论如何操作这个cell数组。 ### 1. MATLAB中使用cell数组进行操作 #### 1.1 访问cell数组中的元素 在MATLAB中,有两种方式访问cell数组的内容: - **使用圆括号`( )`**:返回一个子cell数组(仍然是cell数组)。 - **使用花括号`{ }`**:返回cell内的具体数据。 例如: ```matlab % 访问第一个cell(整个第一个元素,结果仍是一个1x1的cellcell1 = B(1); % 这是一个包含[1,2,3]的cell % 访问第一个cell内的数据(即行向量) row1 = B{1}; % 这是一个行向量 [1,2,3] ``` #### 1.2 修改cell数组中的元素 同样,修改也有两种方式: ```matlab % 修改第一个cell的内容(用新的行向量替换) B{1} = [10,20,30]; % 直接修改第一个cell的数据 % 或者,也可以使用赋值给子cell数组(注意要用cell包裹) B(1) = {[10,20,30]}; % 效果同上 ``` #### 1.3 对cell数组中的每个元素应用函数 使用`cellfun`函数可以对cell数组的每个元素应用指定的函数。 例如,计算每个cell(即原矩阵的每一行)的平均值: ```matlab row_means = cellfun(@mean, B); % 结果:row_means = [2; 5; 8] 因为第一行[1,2,3]的平均值为2,第二行4,5,6的平均值为5,第三行7,8,9的平均值为8 ``` #### 1.4 将cell数组转换回普通矩阵 如果cell数组的每个元素都是相同长度的向量,我们可以使用`cell2mat`函数将其转换为矩阵。注意,转换后默认按行排列(即每行是原cell的一个元素,所以会得到一个3x3矩阵,和原矩阵相同): ```matlab A_restored = cell2mat(B); % 得到原矩阵A ``` 但是,如果我们希望将转换后的cell数组(3x1,每个元素是行向量)按列堆叠成一个列向量(9x1),可以这样做: ```matlab % 先将每个行向量转置为列向量,然后垂直连接 column_vector = vertcat(B{:})'; % 注意:B{:}将cell数组展开为逗号分隔的列表,然后vertcat垂直连接,但注意每个行向量是1x3,所以需要转置成列向量(3x1)再连接?这里需要调整。 % 更直接的方法:将每个cell内的行向量转置为列向量,然后连接 % 方法1:循环 col_vec = []; for i=1:length(B) col_vec = [col_vec; B{i}(:)]; end % 方法2:使用cellfun和vertcat col_vec = cellfun(@(x) x(:), B, 'UniformOutput', false); % 将每个行向量转换为列向量(每个元素变为3x1) col_vec = vertcat(col_vec{:}); % 垂直连接,得到9x1列向量 ``` #### 1.5 其他操作 - **添加元素**:可以像普通数组一样扩展cell数组。 ```matlab % 在末尾添加一行(一个cell) B{4,1} = [11,12,13]; % 现在B是4x1的cell数组 ``` - **删除元素**:使用空矩阵赋值。 ```matlab B(4) = []; % 删除第四行,变回3x1 ``` ### 2. Python中使用列表或对象数组进行操作 在Python中,我们通常使用列表来存储这些行向量(因为简单),但也可以使用NumPy对象数组。这里以列表为例(因为更常见)。 假设我们已经得到: ```python import numpy as np A = np.array([[1,2,3], [4,5,6], [7,8,9]]) B_list = [A[i, :] for i in range(3)] # B_list是一个列表,有三个元素,每个元素是一个行向量(一维数组) ``` #### 2.1 访问元素 ```python # 访问第一个元素(索引0) row0 = B_list[0] # 返回array([1,2,3]) ``` #### 2.2 修改元素 ```python B_list[0] = np.array([10,20,30]) # 修改第一个元素 ``` #### 2.3 对每个元素应用函数 使用列表推导式: ```python # 计算每行的平均值 row_means = [np.mean(row) for row in B_list] # [2.0, 5.0, 8.0] ``` #### 2.4 转换回普通数组 如果希望恢复原矩阵: ```python A_restored = np.vstack(B_list) # 垂直堆叠,得到3x3矩阵 ``` 如果希望将整个列表转换为一个列向量(按行顺序): ```python # 将每个行向量展平(变成一维数组),然后连接 col_vector = np.concatenate([row.flatten() for row in B_list]) # 或者 col_vector = np.concatenate(B_list) # 因为每个元素都是一维数组,连接后就是按行顺序的9个元素的一维数组 # 如果一定要列向量(9x1),则: col_vector = col_vector.reshape(-1,1) ``` #### 2.5 其他操作 - **添加元素**:使用`append`方法。 ```python B_list.append(np.array([11,12,13])) ``` - **删除元素**:使用`del`或`pop`。 ```python del B_list[-1] # 删除最后一个元素 ``` ### 总结 - **MATLAB**:使用cell数组存储按行分组的向量,通过花括号`{}`访问内容,使用`cellfun`进行批量操作,使用`cell2mat`恢复矩阵。 - **Python**:使用列表存储,通过索引访问,使用列表推导式进行批量操作,使用`np.vstack`恢复矩阵,使用`np.concatenate`连接为向量。 现在,我们可以根据具体需求选择操作。如果您有特定的操作需求(如数学运算),请进一步说明。 §§相关问题§§ 1. MATLAB中`cellfun`函数支持哪些函数?如何自定义函数? 2. Python中NumPy对象数组和列表在存储向量时有何性能差异? 3. 如何对转换后的cell数组(或列表)中的每个行向量进行数学运算(如求平方和)? 4. 在MATLAB中如何将cell数组保存到文件?</think>### 如何在MATLAB/Python中使用cell数组处理3x3矩阵转换结果 #### 一、MATLAB中使用cell数组操作 1. **创建3×1 cell数组** ```matlab % 定义原始矩阵 A = [1,2,3; 4,5,6; 7,8,9]; % 按行转换为3×1 cell数组 B = {A(1,:); A(2,:); A(3,:)}; % 显示结果 disp(B); % 输出: % [1x3 double] % [1x3 double] % [1x3 double] ``` 2. **访问和操作cell元素** ```matlab % 访问第一行数据 row1 = B{1} % 返回 [1,2,3] % 修改第二行数据 B{2} = [10,20,30]; % 计算所有行的平均值 row_means = cellfun(@mean, B); % 返回: [2, 20, 8] ``` 3. **转换回普通矩阵** ```matlab % 将cell数组合并为原矩阵 restored_A = cell2mat(B) % 返回: % [1,2,3] % [10,20,30] % [7,8,9] ``` 4. **高级操作示例** ```matlab % 对所有行向量应用函数 row_sums = cellfun(@(x) sum(x.^2), B); % 计算每行元素的平方和: [14, 1400, 194] % 提取特定列 col2_data = cellfun(@(x) x(2), B); % 返回每行第二列: [2, 20, 8] ``` #### 二、Python中使用似结构(NumPy对象数组) ```python import numpy as np # 创建3×3矩阵 A = np.array([[1,2,3], [4,5,6], [7,8,9]]) # 创建对象数组 B = np.empty((3,1), dtype=object) for i in range(3): B[i,0] = A[i,:] # 访问操作 print(B[0][0]) # 输出: [1 2 3] print(np.mean(B[1][0])) # 计算第二行平均值: 5.0 # 应用函数 squares = np.array([np.sum(x**2) for x in B.flatten()]) # 输出: [14, 77, 194] ``` #### 三、关键操作对比表 | 操作 | MATLAB (cell数组) | Python (对象数组/列表) | |------|-------------------|-----------------------| | **创建** | `B = {A(1,:); ...}` | `B = np.empty((3,1), dtype=object)` | | **访问元素** | `B{2}` | `B[1][0]` | | **修改元素** | `B{3} = [7,8,9]` | `B[2][0] = np.array(...)` | | **应用函数** | `cellfun(@func, B)` | `[func(x) for x in B]` | | **转回矩阵** | `cell2mat(B)` | `np.vstack(B.flatten())` | #### 四、最佳实践建议 1. **MATLAB优先选择**: - 使用`{}`直接创建cell元素[^2] - 利用`cellfun`进行向量化操作 - 需要数值计算时用`cell2mat`转换 2. **Python推荐方案**: ```python # 更简洁的列表方案 B_list = [A[i,:] for i in range(3)] # 操作示例 first_element = B_list[0][0] # 访问第一个元素 row_max = [np.max(row) for row in B_list] # 计算每行最大值 ``` 3. **性能优化**: - MATLAB:预分配cell数组 `C = cell(3,1)` - Python:使用NumPy向量化操作避免循环 > **提示**:在MATLAB中,`B{i}`和`B(i)`有本质区别 - 前者返回单元格内容,后者返回包含该内容的子单元格[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值