maxframe 2.0.0b2__cp37-cp37m-win32.whl → 2.3.0rc1__cp37-cp37m-win32.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of maxframe might be problematic. Click here for more details.
- maxframe/__init__.py +1 -0
- maxframe/_utils.cp37-win32.pyd +0 -0
- maxframe/_utils.pyx +14 -1
- maxframe/codegen/core.py +9 -8
- maxframe/codegen/spe/core.py +1 -1
- maxframe/codegen/spe/dataframe/__init__.py +1 -0
- maxframe/codegen/spe/dataframe/accessors/base.py +18 -0
- maxframe/codegen/spe/dataframe/accessors/dict_.py +25 -130
- maxframe/codegen/spe/dataframe/accessors/list_.py +12 -48
- maxframe/codegen/spe/dataframe/accessors/struct_.py +28 -0
- maxframe/codegen/spe/dataframe/arithmetic.py +7 -2
- maxframe/codegen/spe/dataframe/groupby.py +88 -0
- maxframe/codegen/spe/dataframe/indexing.py +99 -4
- maxframe/codegen/spe/dataframe/merge.py +38 -1
- maxframe/codegen/spe/dataframe/misc.py +11 -33
- maxframe/codegen/spe/dataframe/reduction.py +32 -9
- maxframe/codegen/spe/dataframe/reshape.py +46 -0
- maxframe/codegen/spe/dataframe/sort.py +39 -18
- maxframe/codegen/spe/dataframe/tests/accessors/test_dict.py +9 -15
- maxframe/codegen/spe/dataframe/tests/accessors/test_list.py +4 -7
- maxframe/codegen/spe/dataframe/tests/accessors/test_struct.py +75 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_iloc.py +20 -1
- maxframe/codegen/spe/dataframe/tests/indexing/test_loc.py +35 -0
- maxframe/codegen/spe/dataframe/tests/misc/test_misc.py +0 -32
- maxframe/codegen/spe/dataframe/tests/test_groupby.py +81 -18
- maxframe/codegen/spe/dataframe/tests/test_merge.py +27 -1
- maxframe/codegen/spe/dataframe/tests/test_reduction.py +13 -0
- maxframe/codegen/spe/dataframe/tests/test_reshape.py +79 -0
- maxframe/codegen/spe/dataframe/tests/test_sort.py +20 -0
- maxframe/codegen/spe/dataframe/tseries.py +9 -0
- maxframe/codegen/spe/learn/contrib/lightgbm.py +4 -3
- maxframe/codegen/spe/learn/contrib/tests/test_xgboost.py +2 -1
- maxframe/codegen/spe/learn/metrics/__init__.py +1 -1
- maxframe/codegen/spe/learn/metrics/_ranking.py +76 -0
- maxframe/codegen/spe/learn/metrics/pairwise.py +51 -0
- maxframe/codegen/spe/learn/metrics/tests/test_pairwise.py +36 -0
- maxframe/codegen/spe/learn/metrics/tests/test_ranking.py +59 -0
- maxframe/codegen/spe/tensor/__init__.py +3 -0
- maxframe/codegen/spe/tensor/datasource.py +1 -0
- maxframe/codegen/spe/tensor/fft.py +74 -0
- maxframe/codegen/spe/tensor/linalg.py +29 -2
- maxframe/codegen/spe/tensor/misc.py +79 -25
- maxframe/codegen/spe/tensor/spatial.py +45 -0
- maxframe/codegen/spe/tensor/statistics.py +44 -0
- maxframe/codegen/spe/tensor/tests/test_fft.py +64 -0
- maxframe/codegen/spe/tensor/tests/test_linalg.py +15 -1
- maxframe/codegen/spe/tensor/tests/test_misc.py +52 -2
- maxframe/codegen/spe/tensor/tests/test_spatial.py +33 -0
- maxframe/codegen/spe/tensor/tests/test_statistics.py +15 -1
- maxframe/codegen/spe/tests/test_spe_codegen.py +6 -12
- maxframe/codegen/spe/utils.py +2 -0
- maxframe/config/config.py +73 -9
- maxframe/config/tests/test_validators.py +13 -1
- maxframe/config/validators.py +49 -0
- maxframe/conftest.py +54 -17
- maxframe/core/accessor.py +2 -2
- maxframe/core/base.py +2 -1
- maxframe/core/entity/core.py +5 -0
- maxframe/core/entity/tileables.py +3 -1
- maxframe/core/graph/core.cp37-win32.pyd +0 -0
- maxframe/core/graph/entity.py +8 -3
- maxframe/core/mode.py +6 -1
- maxframe/core/operator/base.py +9 -2
- maxframe/core/operator/core.py +10 -2
- maxframe/core/operator/utils.py +13 -0
- maxframe/dataframe/__init__.py +12 -5
- maxframe/dataframe/accessors/__init__.py +1 -1
- maxframe/dataframe/accessors/compat.py +45 -0
- maxframe/dataframe/accessors/datetime_/__init__.py +4 -1
- maxframe/dataframe/accessors/dict_/contains.py +7 -16
- maxframe/dataframe/accessors/dict_/core.py +48 -0
- maxframe/dataframe/accessors/dict_/getitem.py +17 -21
- maxframe/dataframe/accessors/dict_/length.py +7 -16
- maxframe/dataframe/accessors/dict_/remove.py +6 -18
- maxframe/dataframe/accessors/dict_/setitem.py +8 -18
- maxframe/dataframe/accessors/dict_/tests/test_dict_accessor.py +62 -22
- maxframe/dataframe/accessors/list_/__init__.py +2 -2
- maxframe/dataframe/accessors/list_/core.py +48 -0
- maxframe/dataframe/accessors/list_/getitem.py +12 -19
- maxframe/dataframe/accessors/list_/length.py +7 -16
- maxframe/dataframe/accessors/list_/tests/test_list_accessor.py +11 -9
- maxframe/dataframe/accessors/string_/__init__.py +4 -1
- maxframe/dataframe/accessors/struct_/__init__.py +37 -0
- maxframe/dataframe/accessors/struct_/accessor.py +39 -0
- maxframe/dataframe/accessors/struct_/core.py +43 -0
- maxframe/dataframe/accessors/struct_/dtypes.py +53 -0
- maxframe/dataframe/accessors/struct_/field.py +123 -0
- maxframe/dataframe/accessors/struct_/tests/__init__.py +13 -0
- maxframe/dataframe/accessors/struct_/tests/test_struct_accessor.py +91 -0
- maxframe/dataframe/arithmetic/__init__.py +18 -4
- maxframe/dataframe/arithmetic/between.py +106 -0
- maxframe/dataframe/arithmetic/dot.py +237 -0
- maxframe/dataframe/arithmetic/maximum.py +33 -0
- maxframe/dataframe/arithmetic/minimum.py +33 -0
- maxframe/dataframe/arithmetic/{around.py → round.py} +11 -7
- maxframe/dataframe/core.py +161 -224
- maxframe/dataframe/datasource/__init__.py +18 -0
- maxframe/dataframe/datasource/core.py +6 -0
- maxframe/dataframe/datasource/direct.py +57 -0
- maxframe/dataframe/datasource/from_dict.py +124 -0
- maxframe/dataframe/datasource/from_index.py +1 -1
- maxframe/dataframe/datasource/from_records.py +77 -0
- maxframe/dataframe/datasource/from_tensor.py +109 -41
- maxframe/dataframe/datasource/read_csv.py +21 -14
- maxframe/dataframe/datasource/read_odps_query.py +29 -6
- maxframe/dataframe/datasource/read_odps_table.py +32 -10
- maxframe/dataframe/datasource/read_parquet.py +38 -39
- maxframe/dataframe/datasource/tests/test_datasource.py +37 -0
- maxframe/dataframe/datastore/__init__.py +11 -1
- maxframe/dataframe/datastore/direct.py +268 -0
- maxframe/dataframe/datastore/to_csv.py +29 -41
- maxframe/dataframe/datastore/to_odps.py +36 -4
- maxframe/dataframe/extensions/__init__.py +20 -4
- maxframe/dataframe/extensions/apply_chunk.py +32 -6
- maxframe/dataframe/extensions/cartesian_chunk.py +153 -0
- maxframe/dataframe/extensions/collect_kv.py +126 -0
- maxframe/dataframe/extensions/extract_kv.py +177 -0
- maxframe/dataframe/extensions/flatjson.py +2 -1
- maxframe/dataframe/extensions/map_reduce.py +263 -0
- maxframe/dataframe/extensions/rebalance.py +62 -0
- maxframe/dataframe/extensions/tests/test_apply_chunk.py +9 -2
- maxframe/dataframe/extensions/tests/test_extensions.py +54 -0
- maxframe/dataframe/extensions/tests/test_map_reduce.py +135 -0
- maxframe/dataframe/groupby/__init__.py +17 -2
- maxframe/dataframe/groupby/aggregation.py +86 -49
- maxframe/dataframe/groupby/apply.py +1 -1
- maxframe/dataframe/groupby/apply_chunk.py +19 -5
- maxframe/dataframe/groupby/core.py +116 -16
- maxframe/dataframe/groupby/cum.py +4 -25
- maxframe/dataframe/groupby/expanding.py +264 -0
- maxframe/dataframe/groupby/fill.py +1 -1
- maxframe/dataframe/groupby/getitem.py +12 -5
- maxframe/dataframe/groupby/head.py +11 -1
- maxframe/dataframe/groupby/rank.py +136 -0
- maxframe/dataframe/groupby/rolling.py +206 -0
- maxframe/dataframe/groupby/shift.py +114 -0
- maxframe/dataframe/groupby/tests/test_groupby.py +0 -5
- maxframe/dataframe/indexing/__init__.py +22 -2
- maxframe/dataframe/indexing/droplevel.py +195 -0
- maxframe/dataframe/indexing/filter.py +169 -0
- maxframe/dataframe/indexing/get_level_values.py +76 -0
- maxframe/dataframe/indexing/iat.py +45 -0
- maxframe/dataframe/indexing/iloc.py +152 -12
- maxframe/dataframe/indexing/insert.py +46 -18
- maxframe/dataframe/indexing/loc.py +287 -7
- maxframe/dataframe/indexing/reindex.py +14 -5
- maxframe/dataframe/indexing/rename.py +6 -0
- maxframe/dataframe/indexing/rename_axis.py +2 -2
- maxframe/dataframe/indexing/reorder_levels.py +143 -0
- maxframe/dataframe/indexing/reset_index.py +33 -6
- maxframe/dataframe/indexing/sample.py +8 -0
- maxframe/dataframe/indexing/setitem.py +3 -3
- maxframe/dataframe/indexing/swaplevel.py +185 -0
- maxframe/dataframe/indexing/take.py +99 -0
- maxframe/dataframe/indexing/truncate.py +140 -0
- maxframe/dataframe/indexing/where.py +0 -11
- maxframe/dataframe/indexing/xs.py +148 -0
- maxframe/dataframe/merge/__init__.py +15 -1
- maxframe/dataframe/merge/append.py +97 -98
- maxframe/dataframe/merge/combine.py +244 -0
- maxframe/dataframe/merge/combine_first.py +120 -0
- maxframe/dataframe/merge/compare.py +387 -0
- maxframe/dataframe/merge/concat.py +183 -0
- maxframe/dataframe/merge/update.py +271 -0
- maxframe/dataframe/misc/__init__.py +28 -11
- maxframe/dataframe/misc/_duplicate.py +10 -4
- maxframe/dataframe/misc/apply.py +1 -1
- maxframe/dataframe/misc/check_unique.py +82 -0
- maxframe/dataframe/misc/clip.py +145 -0
- maxframe/dataframe/misc/describe.py +175 -9
- maxframe/dataframe/misc/drop.py +31 -0
- maxframe/dataframe/misc/drop_duplicates.py +2 -2
- maxframe/dataframe/misc/duplicated.py +2 -2
- maxframe/dataframe/misc/get_dummies.py +5 -1
- maxframe/dataframe/misc/infer_dtypes.py +251 -0
- maxframe/dataframe/misc/isin.py +2 -2
- maxframe/dataframe/misc/map.py +125 -18
- maxframe/dataframe/misc/repeat.py +159 -0
- maxframe/dataframe/misc/tests/test_misc.py +48 -3
- maxframe/dataframe/misc/to_numeric.py +3 -0
- maxframe/dataframe/misc/transform.py +12 -5
- maxframe/dataframe/misc/transpose.py +13 -1
- maxframe/dataframe/misc/valid_index.py +115 -0
- maxframe/dataframe/misc/value_counts.py +38 -4
- maxframe/dataframe/missing/checkna.py +14 -6
- maxframe/dataframe/missing/dropna.py +5 -0
- maxframe/dataframe/missing/fillna.py +1 -1
- maxframe/dataframe/missing/replace.py +7 -4
- maxframe/dataframe/reduction/__init__.py +35 -16
- maxframe/dataframe/reduction/aggregation.py +43 -14
- maxframe/dataframe/reduction/all.py +2 -2
- maxframe/dataframe/reduction/any.py +2 -2
- maxframe/dataframe/reduction/argmax.py +103 -0
- maxframe/dataframe/reduction/argmin.py +103 -0
- maxframe/dataframe/reduction/core.py +80 -24
- maxframe/dataframe/reduction/count.py +13 -9
- maxframe/dataframe/reduction/cov.py +166 -0
- maxframe/dataframe/reduction/cummax.py +2 -2
- maxframe/dataframe/reduction/cummin.py +2 -2
- maxframe/dataframe/reduction/cumprod.py +2 -2
- maxframe/dataframe/reduction/cumsum.py +2 -2
- maxframe/dataframe/reduction/custom_reduction.py +2 -2
- maxframe/dataframe/reduction/idxmax.py +185 -0
- maxframe/dataframe/reduction/idxmin.py +185 -0
- maxframe/dataframe/reduction/kurtosis.py +37 -30
- maxframe/dataframe/reduction/max.py +2 -2
- maxframe/dataframe/reduction/mean.py +9 -7
- maxframe/dataframe/reduction/median.py +2 -2
- maxframe/dataframe/reduction/min.py +2 -2
- maxframe/dataframe/reduction/mode.py +144 -0
- maxframe/dataframe/reduction/nunique.py +19 -11
- maxframe/dataframe/reduction/prod.py +18 -13
- maxframe/dataframe/reduction/reduction_size.py +2 -2
- maxframe/dataframe/reduction/sem.py +13 -9
- maxframe/dataframe/reduction/skew.py +31 -27
- maxframe/dataframe/reduction/str_concat.py +10 -7
- maxframe/dataframe/reduction/sum.py +18 -14
- maxframe/dataframe/reduction/tests/test_reduction.py +12 -0
- maxframe/dataframe/reduction/unique.py +20 -3
- maxframe/dataframe/reduction/var.py +16 -12
- maxframe/dataframe/reshape/__init__.py +38 -0
- maxframe/dataframe/{misc → reshape}/pivot.py +1 -0
- maxframe/dataframe/{misc → reshape}/pivot_table.py +1 -0
- maxframe/dataframe/reshape/unstack.py +114 -0
- maxframe/dataframe/sort/__init__.py +16 -1
- maxframe/dataframe/sort/argsort.py +68 -0
- maxframe/dataframe/sort/core.py +2 -1
- maxframe/dataframe/sort/nlargest.py +238 -0
- maxframe/dataframe/sort/nsmallest.py +228 -0
- maxframe/dataframe/sort/rank.py +147 -0
- maxframe/dataframe/statistics/__init__.py +3 -3
- maxframe/dataframe/statistics/corr.py +1 -0
- maxframe/dataframe/statistics/quantile.py +2 -2
- maxframe/dataframe/tests/test_typing.py +104 -0
- maxframe/dataframe/tests/test_utils.py +66 -2
- maxframe/dataframe/tseries/__init__.py +19 -0
- maxframe/dataframe/tseries/at_time.py +61 -0
- maxframe/dataframe/tseries/between_time.py +122 -0
- maxframe/dataframe/typing_.py +185 -0
- maxframe/dataframe/utils.py +125 -52
- maxframe/dataframe/window/aggregation.py +8 -4
- maxframe/dataframe/window/core.py +14 -1
- maxframe/dataframe/window/ewm.py +1 -3
- maxframe/dataframe/window/expanding.py +37 -35
- maxframe/dataframe/window/rolling.py +49 -39
- maxframe/dataframe/window/tests/test_expanding.py +1 -7
- maxframe/dataframe/window/tests/test_rolling.py +1 -1
- maxframe/env.py +7 -4
- maxframe/errors.py +2 -2
- maxframe/io/odpsio/schema.py +9 -3
- maxframe/io/odpsio/tableio.py +7 -2
- maxframe/io/odpsio/tests/test_schema.py +198 -83
- maxframe/learn/__init__.py +10 -2
- maxframe/learn/cluster/__init__.py +15 -0
- maxframe/learn/cluster/_kmeans.py +782 -0
- maxframe/learn/contrib/llm/core.py +18 -7
- maxframe/learn/contrib/llm/deploy/__init__.py +13 -0
- maxframe/learn/contrib/llm/deploy/config.py +221 -0
- maxframe/learn/contrib/llm/deploy/core.py +247 -0
- maxframe/learn/contrib/llm/deploy/framework.py +35 -0
- maxframe/learn/contrib/llm/deploy/loader.py +360 -0
- maxframe/learn/contrib/llm/deploy/tests/__init__.py +13 -0
- maxframe/learn/contrib/llm/deploy/tests/test_register_models.py +359 -0
- maxframe/learn/contrib/llm/models/__init__.py +1 -0
- maxframe/learn/contrib/llm/models/dashscope.py +12 -6
- maxframe/learn/contrib/llm/models/managed.py +76 -11
- maxframe/learn/contrib/llm/models/openai.py +72 -0
- maxframe/learn/contrib/llm/tests/__init__.py +13 -0
- maxframe/learn/contrib/llm/tests/test_core.py +34 -0
- maxframe/learn/contrib/llm/tests/test_openai.py +187 -0
- maxframe/learn/contrib/llm/tests/test_text_gen.py +155 -0
- maxframe/learn/contrib/llm/text.py +348 -42
- maxframe/learn/contrib/models.py +4 -1
- maxframe/learn/contrib/xgboost/classifier.py +2 -0
- maxframe/learn/contrib/xgboost/core.py +113 -4
- maxframe/learn/contrib/xgboost/predict.py +4 -2
- maxframe/learn/contrib/xgboost/regressor.py +5 -0
- maxframe/learn/contrib/xgboost/train.py +7 -2
- maxframe/learn/core.py +66 -0
- maxframe/learn/linear_model/_base.py +58 -1
- maxframe/learn/linear_model/_lin_reg.py +1 -1
- maxframe/learn/metrics/__init__.py +6 -0
- maxframe/learn/metrics/_classification.py +145 -0
- maxframe/learn/metrics/_ranking.py +477 -0
- maxframe/learn/metrics/_scorer.py +60 -0
- maxframe/learn/metrics/pairwise/__init__.py +21 -0
- maxframe/learn/metrics/pairwise/core.py +77 -0
- maxframe/learn/metrics/pairwise/cosine.py +115 -0
- maxframe/learn/metrics/pairwise/euclidean.py +176 -0
- maxframe/learn/metrics/pairwise/haversine.py +96 -0
- maxframe/learn/metrics/pairwise/manhattan.py +80 -0
- maxframe/learn/metrics/pairwise/pairwise.py +127 -0
- maxframe/learn/metrics/pairwise/pairwise_distances_topk.py +121 -0
- maxframe/learn/metrics/pairwise/rbf_kernel.py +51 -0
- maxframe/learn/metrics/tests/__init__.py +13 -0
- maxframe/learn/metrics/tests/test_scorer.py +26 -0
- maxframe/learn/preprocessing/_data/min_max_scaler.py +34 -23
- maxframe/learn/preprocessing/_data/standard_scaler.py +34 -25
- maxframe/learn/utils/__init__.py +2 -1
- maxframe/learn/utils/checks.py +1 -2
- maxframe/learn/utils/core.py +59 -0
- maxframe/learn/utils/extmath.py +79 -9
- maxframe/learn/utils/odpsio.py +262 -0
- maxframe/learn/utils/validation.py +2 -2
- maxframe/lib/compat.py +40 -0
- maxframe/lib/dtypes_extension/__init__.py +16 -1
- maxframe/lib/dtypes_extension/_fake_arrow_dtype.py +604 -0
- maxframe/lib/dtypes_extension/blob.py +304 -0
- maxframe/lib/dtypes_extension/dtypes.py +40 -0
- maxframe/lib/dtypes_extension/tests/test_blob.py +88 -0
- maxframe/lib/dtypes_extension/tests/test_dtypes.py +16 -1
- maxframe/lib/dtypes_extension/tests/test_fake_arrow_dtype.py +75 -0
- maxframe/lib/filesystem/_oss_lib/common.py +124 -50
- maxframe/lib/filesystem/_oss_lib/glob.py +1 -1
- maxframe/lib/filesystem/_oss_lib/handle.py +21 -25
- maxframe/lib/filesystem/base.py +1 -1
- maxframe/lib/filesystem/core.py +1 -1
- maxframe/lib/filesystem/oss.py +115 -46
- maxframe/lib/filesystem/tests/test_oss.py +74 -36
- maxframe/lib/mmh3.cp37-win32.pyd +0 -0
- maxframe/lib/wrapped_pickle.py +10 -0
- maxframe/opcodes.py +41 -15
- maxframe/protocol.py +12 -0
- maxframe/remote/core.py +4 -0
- maxframe/serialization/__init__.py +11 -2
- maxframe/serialization/arrow.py +38 -13
- maxframe/serialization/blob.py +32 -0
- maxframe/serialization/core.cp37-win32.pyd +0 -0
- maxframe/serialization/core.pyx +39 -1
- maxframe/serialization/exception.py +2 -4
- maxframe/serialization/numpy.py +11 -0
- maxframe/serialization/pandas.py +46 -9
- maxframe/serialization/serializables/core.py +2 -2
- maxframe/serialization/tests/test_serial.py +31 -4
- maxframe/tensor/__init__.py +38 -8
- maxframe/tensor/arithmetic/__init__.py +19 -10
- maxframe/tensor/arithmetic/core.py +2 -2
- maxframe/tensor/arithmetic/iscomplexobj.py +53 -0
- maxframe/tensor/arithmetic/tests/test_arithmetic.py +6 -9
- maxframe/tensor/core.py +6 -2
- maxframe/tensor/datasource/tests/test_datasource.py +2 -1
- maxframe/tensor/extensions/__init__.py +2 -0
- maxframe/tensor/extensions/apply_chunk.py +3 -3
- maxframe/tensor/extensions/rebalance.py +65 -0
- maxframe/tensor/fft/__init__.py +32 -0
- maxframe/tensor/fft/core.py +168 -0
- maxframe/tensor/fft/fft.py +112 -0
- maxframe/tensor/fft/fft2.py +118 -0
- maxframe/tensor/fft/fftfreq.py +80 -0
- maxframe/tensor/fft/fftn.py +123 -0
- maxframe/tensor/fft/fftshift.py +79 -0
- maxframe/tensor/fft/hfft.py +112 -0
- maxframe/tensor/fft/ifft.py +114 -0
- maxframe/tensor/fft/ifft2.py +115 -0
- maxframe/tensor/fft/ifftn.py +123 -0
- maxframe/tensor/fft/ifftshift.py +73 -0
- maxframe/tensor/fft/ihfft.py +93 -0
- maxframe/tensor/fft/irfft.py +118 -0
- maxframe/tensor/fft/irfft2.py +62 -0
- maxframe/tensor/fft/irfftn.py +114 -0
- maxframe/tensor/fft/rfft.py +116 -0
- maxframe/tensor/fft/rfft2.py +63 -0
- maxframe/tensor/fft/rfftfreq.py +87 -0
- maxframe/tensor/fft/rfftn.py +113 -0
- maxframe/tensor/indexing/fill_diagonal.py +1 -7
- maxframe/tensor/linalg/__init__.py +7 -0
- maxframe/tensor/linalg/_einsumfunc.py +1025 -0
- maxframe/tensor/linalg/cholesky.py +117 -0
- maxframe/tensor/linalg/einsum.py +339 -0
- maxframe/tensor/linalg/lstsq.py +100 -0
- maxframe/tensor/linalg/matrix_norm.py +75 -0
- maxframe/tensor/linalg/norm.py +249 -0
- maxframe/tensor/linalg/solve.py +72 -0
- maxframe/tensor/linalg/solve_triangular.py +2 -2
- maxframe/tensor/linalg/vector_norm.py +113 -0
- maxframe/tensor/misc/__init__.py +24 -1
- maxframe/tensor/misc/argwhere.py +72 -0
- maxframe/tensor/misc/array_split.py +46 -0
- maxframe/tensor/misc/broadcast_arrays.py +57 -0
- maxframe/tensor/misc/copyto.py +130 -0
- maxframe/tensor/misc/delete.py +104 -0
- maxframe/tensor/misc/dsplit.py +68 -0
- maxframe/tensor/misc/ediff1d.py +74 -0
- maxframe/tensor/misc/expand_dims.py +85 -0
- maxframe/tensor/misc/flip.py +90 -0
- maxframe/tensor/misc/fliplr.py +64 -0
- maxframe/tensor/misc/flipud.py +68 -0
- maxframe/tensor/misc/hsplit.py +85 -0
- maxframe/tensor/misc/insert.py +139 -0
- maxframe/tensor/misc/moveaxis.py +83 -0
- maxframe/tensor/misc/result_type.py +88 -0
- maxframe/tensor/misc/roll.py +124 -0
- maxframe/tensor/misc/rollaxis.py +77 -0
- maxframe/tensor/misc/shape.py +89 -0
- maxframe/tensor/misc/split.py +190 -0
- maxframe/tensor/misc/tile.py +109 -0
- maxframe/tensor/misc/vsplit.py +74 -0
- maxframe/tensor/reduction/array_equal.py +2 -1
- maxframe/tensor/sort/__init__.py +2 -0
- maxframe/tensor/sort/argpartition.py +98 -0
- maxframe/tensor/sort/partition.py +228 -0
- maxframe/tensor/spatial/__init__.py +15 -0
- maxframe/tensor/spatial/distance/__init__.py +17 -0
- maxframe/tensor/spatial/distance/cdist.py +421 -0
- maxframe/tensor/spatial/distance/pdist.py +398 -0
- maxframe/tensor/spatial/distance/squareform.py +153 -0
- maxframe/tensor/special/__init__.py +159 -21
- maxframe/tensor/special/airy.py +55 -0
- maxframe/tensor/special/bessel.py +199 -0
- maxframe/tensor/special/core.py +65 -4
- maxframe/tensor/special/ellip_func_integrals.py +155 -0
- maxframe/tensor/special/ellip_harm.py +55 -0
- maxframe/tensor/special/err_fresnel.py +223 -0
- maxframe/tensor/special/gamma_funcs.py +303 -0
- maxframe/tensor/special/hypergeometric_funcs.py +69 -0
- maxframe/tensor/special/info_theory.py +189 -0
- maxframe/tensor/special/misc.py +21 -0
- maxframe/tensor/statistics/__init__.py +6 -0
- maxframe/tensor/statistics/corrcoef.py +77 -0
- maxframe/tensor/statistics/cov.py +222 -0
- maxframe/tensor/statistics/digitize.py +126 -0
- maxframe/tensor/statistics/histogram.py +520 -0
- maxframe/tensor/statistics/median.py +85 -0
- maxframe/tensor/statistics/ptp.py +89 -0
- maxframe/tensor/utils.py +3 -3
- maxframe/tests/test_udf.py +61 -0
- maxframe/tests/test_utils.py +51 -6
- maxframe/tests/utils.py +0 -2
- maxframe/typing_.py +2 -0
- maxframe/udf.py +130 -9
- maxframe/utils.py +254 -27
- {maxframe-2.0.0b2.dist-info → maxframe-2.3.0rc1.dist-info}/METADATA +3 -3
- {maxframe-2.0.0b2.dist-info → maxframe-2.3.0rc1.dist-info}/RECORD +442 -264
- maxframe_client/fetcher.py +35 -4
- maxframe_client/session/odps.py +7 -2
- maxframe_client/session/task.py +8 -1
- maxframe_client/tests/test_fetcher.py +76 -3
- maxframe_client/tests/test_session.py +28 -1
- maxframe/dataframe/arrays.py +0 -864
- /maxframe/dataframe/{misc → reshape}/melt.py +0 -0
- /maxframe/dataframe/{misc → reshape}/stack.py +0 -0
- {maxframe-2.0.0b2.dist-info → maxframe-2.3.0rc1.dist-info}/WHEEL +0 -0
- {maxframe-2.0.0b2.dist-info → maxframe-2.3.0rc1.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from .split import split
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def hsplit(a, indices_or_sections):
|
|
19
|
+
"""
|
|
20
|
+
Split a tensor into multiple sub-tensors horizontally (column-wise).
|
|
21
|
+
|
|
22
|
+
Please refer to the `split` documentation. `hsplit` is equivalent
|
|
23
|
+
to `split` with ``axis=1``, the tensor is always split along the second
|
|
24
|
+
axis regardless of the tensor dimension.
|
|
25
|
+
|
|
26
|
+
See Also
|
|
27
|
+
--------
|
|
28
|
+
split : Split an array into multiple sub-arrays of equal size.
|
|
29
|
+
|
|
30
|
+
Examples
|
|
31
|
+
--------
|
|
32
|
+
>>> import maxframe.tensor as mt
|
|
33
|
+
|
|
34
|
+
>>> x = mt.arange(16.0).reshape(4, 4)
|
|
35
|
+
>>> x.execute()
|
|
36
|
+
array([[ 0., 1., 2., 3.],
|
|
37
|
+
[ 4., 5., 6., 7.],
|
|
38
|
+
[ 8., 9., 10., 11.],
|
|
39
|
+
[ 12., 13., 14., 15.]])
|
|
40
|
+
>>> mt.hsplit(x, 2).execute()
|
|
41
|
+
[array([[ 0., 1.],
|
|
42
|
+
[ 4., 5.],
|
|
43
|
+
[ 8., 9.],
|
|
44
|
+
[ 12., 13.]]),
|
|
45
|
+
array([[ 2., 3.],
|
|
46
|
+
[ 6., 7.],
|
|
47
|
+
[ 10., 11.],
|
|
48
|
+
[ 14., 15.]])]
|
|
49
|
+
>>> mt.hsplit(x, mt.array([3, 6])).execute()
|
|
50
|
+
[array([[ 0., 1., 2.],
|
|
51
|
+
[ 4., 5., 6.],
|
|
52
|
+
[ 8., 9., 10.],
|
|
53
|
+
[ 12., 13., 14.]]),
|
|
54
|
+
array([[ 3.],
|
|
55
|
+
[ 7.],
|
|
56
|
+
[ 11.],
|
|
57
|
+
[ 15.]]),
|
|
58
|
+
array([], dtype=float64)]
|
|
59
|
+
|
|
60
|
+
With a higher dimensional array the split is still along the second axis.
|
|
61
|
+
|
|
62
|
+
>>> x = mt.arange(8.0).reshape(2, 2, 2)
|
|
63
|
+
>>> x.execute()
|
|
64
|
+
array([[[ 0., 1.],
|
|
65
|
+
[ 2., 3.]],
|
|
66
|
+
[[ 4., 5.],
|
|
67
|
+
[ 6., 7.]]])
|
|
68
|
+
>>> mt.hsplit(x, 2)
|
|
69
|
+
[array([[[ 0., 1.]],
|
|
70
|
+
[[ 4., 5.]]]),
|
|
71
|
+
array([[[ 2., 3.]],
|
|
72
|
+
[[ 6., 7.]]])]
|
|
73
|
+
|
|
74
|
+
"""
|
|
75
|
+
from ..datasource import tensor as astensor
|
|
76
|
+
|
|
77
|
+
ary = a
|
|
78
|
+
a = astensor(a)
|
|
79
|
+
|
|
80
|
+
if a.ndim == 0:
|
|
81
|
+
raise ValueError("hsplit only works on tensors of 1 or more dimensions")
|
|
82
|
+
if a.ndim > 1:
|
|
83
|
+
return split(ary, indices_or_sections, 1)
|
|
84
|
+
else:
|
|
85
|
+
return split(ary, indices_or_sections, 0)
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from typing import List
|
|
16
|
+
|
|
17
|
+
from ... import opcodes
|
|
18
|
+
from ...core import ENTITY_TYPE, EntityData
|
|
19
|
+
from ...serialization.serializables import AnyField, Int32Field, TupleField
|
|
20
|
+
from ..operators import TensorHasInput, TensorOperatorMixin
|
|
21
|
+
from ..utils import calc_object_length, filter_inputs, validate_axis
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class TensorInsert(TensorHasInput, TensorOperatorMixin):
|
|
25
|
+
_op_type_ = opcodes.INSERT
|
|
26
|
+
|
|
27
|
+
index_obj = AnyField("index_obj", default=None)
|
|
28
|
+
values = AnyField("values", default=None)
|
|
29
|
+
axis = Int32Field("axis", default=None)
|
|
30
|
+
|
|
31
|
+
# for chunk
|
|
32
|
+
range_on_axis = TupleField("range_on_axis", default=None)
|
|
33
|
+
|
|
34
|
+
@classmethod
|
|
35
|
+
def _set_inputs(cls, op: "TensorInsert", inputs: List[EntityData]):
|
|
36
|
+
super()._set_inputs(op, inputs)
|
|
37
|
+
inputs_iter = iter(inputs[1:])
|
|
38
|
+
if isinstance(op.index_obj, ENTITY_TYPE):
|
|
39
|
+
op.index_obj = next(inputs_iter)
|
|
40
|
+
if isinstance(op.values, ENTITY_TYPE):
|
|
41
|
+
op.values = next(inputs_iter)
|
|
42
|
+
|
|
43
|
+
def __call__(self, arr, obj, values, shape):
|
|
44
|
+
return self.new_tensor(
|
|
45
|
+
filter_inputs([arr, obj, values]), shape=shape, order=arr.order
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def insert(arr, obj, values, axis=None):
|
|
50
|
+
"""
|
|
51
|
+
Insert values along the given axis before the given indices.
|
|
52
|
+
|
|
53
|
+
Parameters
|
|
54
|
+
----------
|
|
55
|
+
arr : array like
|
|
56
|
+
Input array.
|
|
57
|
+
obj : int, slice or sequence of ints
|
|
58
|
+
Object that defines the index or indices before which `values` is
|
|
59
|
+
inserted.
|
|
60
|
+
values : array_like
|
|
61
|
+
Values to insert into `arr`. If the type of `values` is different
|
|
62
|
+
from that of `arr`, `values` is converted to the type of `arr`.
|
|
63
|
+
`values` should be shaped so that ``arr[...,obj,...] = values``
|
|
64
|
+
is legal.
|
|
65
|
+
axis : int, optional
|
|
66
|
+
Axis along which to insert `values`. If `axis` is None then `arr`
|
|
67
|
+
is flattened first.
|
|
68
|
+
Returns
|
|
69
|
+
-------
|
|
70
|
+
out : ndarray
|
|
71
|
+
A copy of `arr` with `values` inserted. Note that `insert`
|
|
72
|
+
does not occur in-place: a new array is returned. If
|
|
73
|
+
`axis` is None, `out` is a flattened array.
|
|
74
|
+
See Also
|
|
75
|
+
--------
|
|
76
|
+
append : Append elements at the end of an array.
|
|
77
|
+
concatenate : Join a sequence of arrays along an existing axis.
|
|
78
|
+
delete : Delete elements from an array.
|
|
79
|
+
Notes
|
|
80
|
+
-----
|
|
81
|
+
Note that for higher dimensional inserts `obj=0` behaves very different
|
|
82
|
+
from `obj=[0]` just like `arr[:,0,:] = values` is different from
|
|
83
|
+
`arr[:,[0],:] = values`.
|
|
84
|
+
Examples
|
|
85
|
+
--------
|
|
86
|
+
>>> import maxframe.tensor as mt
|
|
87
|
+
>>> a = mt.array([[1, 1], [2, 2], [3, 3]])
|
|
88
|
+
>>> a.execute()
|
|
89
|
+
array([[1, 1],
|
|
90
|
+
[2, 2],
|
|
91
|
+
[3, 3]])
|
|
92
|
+
>>> mt.insert(a, 1, 5).execute()
|
|
93
|
+
array([1, 5, 1, ..., 2, 3, 3])
|
|
94
|
+
>>> mt.insert(a, 1, 5, axis=1).execute()
|
|
95
|
+
array([[1, 5, 1],
|
|
96
|
+
[2, 5, 2],
|
|
97
|
+
[3, 5, 3]])
|
|
98
|
+
Difference between sequence and scalars:
|
|
99
|
+
>>> mt.insert(a, [1], [[1],[2],[3]], axis=1).execute()
|
|
100
|
+
array([[1, 1, 1],
|
|
101
|
+
[2, 2, 2],
|
|
102
|
+
[3, 3, 3]])
|
|
103
|
+
>>> b = a.flatten()
|
|
104
|
+
>>> b.execute()
|
|
105
|
+
array([1, 1, 2, 2, 3, 3])
|
|
106
|
+
>>> mt.insert(b, [2, 2], [5, 6]).execute()
|
|
107
|
+
array([1, 1, 5, ..., 2, 3, 3])
|
|
108
|
+
>>> mt.insert(b, slice(2, 4), [5, 6]).execute()
|
|
109
|
+
array([1, 1, 5, ..., 2, 3, 3])
|
|
110
|
+
>>> mt.insert(b, [2, 2], [7.13, False]).execute() # type casting
|
|
111
|
+
array([1, 1, 7, ..., 2, 3, 3])
|
|
112
|
+
>>> x = mt.arange(8).reshape(2, 4)
|
|
113
|
+
>>> idx = (1, 3)
|
|
114
|
+
>>> mt.insert(x, idx, 999, axis=1).execute()
|
|
115
|
+
array([[ 0, 999, 1, 2, 999, 3],
|
|
116
|
+
[ 4, 999, 5, 6, 999, 7]])
|
|
117
|
+
"""
|
|
118
|
+
from ..datasource import tensor as astensor
|
|
119
|
+
|
|
120
|
+
arr = astensor(arr)
|
|
121
|
+
if getattr(obj, "ndim", 0) > 1: # pragma: no cover
|
|
122
|
+
raise ValueError(
|
|
123
|
+
"index array argument obj to insert must be one dimensional or scalar"
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
if axis is None:
|
|
127
|
+
# if axis is None, array will be flatten
|
|
128
|
+
arr_size = arr.size
|
|
129
|
+
idx_length = calc_object_length(obj, size=arr_size)
|
|
130
|
+
shape = (arr_size + idx_length,)
|
|
131
|
+
else:
|
|
132
|
+
validate_axis(arr.ndim, axis)
|
|
133
|
+
idx_length = calc_object_length(obj, size=arr.shape[axis])
|
|
134
|
+
shape = tuple(
|
|
135
|
+
s + idx_length if i == axis else s for i, s in enumerate(arr.shape)
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
op = TensorInsert(index_obj=obj, values=values, axis=axis, dtype=arr.dtype)
|
|
139
|
+
return op(arr, obj, values, shape)
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from ..datasource import tensor as astensor
|
|
16
|
+
from ..utils import normalize_axis_tuple
|
|
17
|
+
from .transpose import transpose
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def moveaxis(a, source, destination):
|
|
21
|
+
"""
|
|
22
|
+
Move axes of a tensor to new positions.
|
|
23
|
+
|
|
24
|
+
Other axes remain in their original order.
|
|
25
|
+
|
|
26
|
+
Parameters
|
|
27
|
+
----------
|
|
28
|
+
a : Tensor
|
|
29
|
+
The tensor whose axes should be reordered.
|
|
30
|
+
source : int or sequence of int
|
|
31
|
+
Original positions of the axes to move. These must be unique.
|
|
32
|
+
destination : int or sequence of int
|
|
33
|
+
Destination positions for each of the original axes. These must also be
|
|
34
|
+
unique.
|
|
35
|
+
|
|
36
|
+
Returns
|
|
37
|
+
-------
|
|
38
|
+
result : Tensor
|
|
39
|
+
Array with moved axes. This tensor is a view of the input tensor.
|
|
40
|
+
|
|
41
|
+
See Also
|
|
42
|
+
--------
|
|
43
|
+
transpose: Permute the dimensions of an array.
|
|
44
|
+
swapaxes: Interchange two axes of an array.
|
|
45
|
+
|
|
46
|
+
Examples
|
|
47
|
+
--------
|
|
48
|
+
>>> import maxframe.tensor as mt
|
|
49
|
+
|
|
50
|
+
>>> x = mt.zeros((3, 4, 5))
|
|
51
|
+
>>> mt.moveaxis(x, 0, -1).shape
|
|
52
|
+
(4, 5, 3)
|
|
53
|
+
>>> mt.moveaxis(x, -1, 0).shape
|
|
54
|
+
(5, 3, 4),
|
|
55
|
+
|
|
56
|
+
These all achieve the same result:
|
|
57
|
+
|
|
58
|
+
>>> mt.transpose(x).shape
|
|
59
|
+
(5, 4, 3)
|
|
60
|
+
>>> mt.swapaxes(x, 0, -1).shape
|
|
61
|
+
(5, 4, 3)
|
|
62
|
+
>>> mt.moveaxis(x, [0, 1], [-1, -2]).shape
|
|
63
|
+
(5, 4, 3)
|
|
64
|
+
>>> mt.moveaxis(x, [0, 1, 2], [-1, -2, -3]).shape
|
|
65
|
+
(5, 4, 3)
|
|
66
|
+
|
|
67
|
+
"""
|
|
68
|
+
a = astensor(a)
|
|
69
|
+
|
|
70
|
+
source = normalize_axis_tuple(source, a.ndim, "source")
|
|
71
|
+
destination = normalize_axis_tuple(destination, a.ndim, "destination")
|
|
72
|
+
if len(source) != len(destination):
|
|
73
|
+
raise ValueError(
|
|
74
|
+
"`source` and `destination` arguments must have "
|
|
75
|
+
"the same number of elements"
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
order = [n for n in range(a.ndim) if n not in source]
|
|
79
|
+
|
|
80
|
+
for dest, src in sorted(zip(destination, source)):
|
|
81
|
+
order.insert(dest, src)
|
|
82
|
+
|
|
83
|
+
return transpose(a, order)
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
import numpy as np
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def result_type(*tensors_and_dtypes):
|
|
19
|
+
"""
|
|
20
|
+
Returns the type that results from applying the NumPy
|
|
21
|
+
type promotion rules to the arguments.
|
|
22
|
+
|
|
23
|
+
Type promotion in MaxFrame works similarly to the rules in languages
|
|
24
|
+
like C++, with some slight differences. When both scalars and
|
|
25
|
+
arrays are used, the array's type takes precedence and the actual value
|
|
26
|
+
of the scalar is taken into account.
|
|
27
|
+
|
|
28
|
+
For example, calculating 3*a, where a is an array of 32-bit floats,
|
|
29
|
+
intuitively should result in a 32-bit float output. If the 3 is a
|
|
30
|
+
32-bit integer, the NumPy rules indicate it can't convert losslessly
|
|
31
|
+
into a 32-bit float, so a 64-bit float should be the result type.
|
|
32
|
+
By examining the value of the constant, '3', we see that it fits in
|
|
33
|
+
an 8-bit integer, which can be cast losslessly into the 32-bit float.
|
|
34
|
+
|
|
35
|
+
Parameters
|
|
36
|
+
----------
|
|
37
|
+
tensors_and_dtypes : list of tensors and dtypes
|
|
38
|
+
The operands of some operation whose result type is needed.
|
|
39
|
+
|
|
40
|
+
Returns
|
|
41
|
+
-------
|
|
42
|
+
out : dtype
|
|
43
|
+
The result type.
|
|
44
|
+
|
|
45
|
+
See also
|
|
46
|
+
--------
|
|
47
|
+
dtype, promote_types, min_scalar_type, can_cast
|
|
48
|
+
|
|
49
|
+
Notes
|
|
50
|
+
-----
|
|
51
|
+
The specific algorithm used is as follows.
|
|
52
|
+
|
|
53
|
+
Categories are determined by first checking which of boolean,
|
|
54
|
+
integer (int/uint), or floating point (float/complex) the maximum
|
|
55
|
+
kind of all the arrays and the scalars are.
|
|
56
|
+
|
|
57
|
+
If there are only scalars or the maximum category of the scalars
|
|
58
|
+
is higher than the maximum category of the arrays,
|
|
59
|
+
the data types are combined with :func:`promote_types`
|
|
60
|
+
to produce the return value.
|
|
61
|
+
|
|
62
|
+
Otherwise, `min_scalar_type` is called on each array, and
|
|
63
|
+
the resulting data types are all combined with :func:`promote_types`
|
|
64
|
+
to produce the return value.
|
|
65
|
+
|
|
66
|
+
The set of int values is not a subset of the uint values for types
|
|
67
|
+
with the same number of bits, something not reflected in
|
|
68
|
+
:func:`min_scalar_type`, but handled as a special case in `result_type`.
|
|
69
|
+
|
|
70
|
+
Examples
|
|
71
|
+
--------
|
|
72
|
+
>>> import maxframe.tensor as mt
|
|
73
|
+
|
|
74
|
+
>>> mt.result_type(3, mt.arange(7, dtype='i1'))
|
|
75
|
+
dtype('int8')
|
|
76
|
+
|
|
77
|
+
>>> mt.result_type('i4', 'c8')
|
|
78
|
+
dtype('complex128')
|
|
79
|
+
|
|
80
|
+
>>> mt.result_type(3.0, -2)
|
|
81
|
+
dtype('float64')
|
|
82
|
+
"""
|
|
83
|
+
from ..core import Tensor
|
|
84
|
+
|
|
85
|
+
arrays_and_dtypes = [
|
|
86
|
+
a.dtype if isinstance(a, Tensor) else a for a in tensors_and_dtypes
|
|
87
|
+
]
|
|
88
|
+
return np.result_type(*arrays_and_dtypes)
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.'
|
|
14
|
+
|
|
15
|
+
from collections.abc import Iterable
|
|
16
|
+
|
|
17
|
+
import numpy as np
|
|
18
|
+
|
|
19
|
+
from ..utils import validate_axis
|
|
20
|
+
from .ravel import ravel
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def roll(a, shift, axis=None):
|
|
24
|
+
"""
|
|
25
|
+
Roll tensor elements along a given axis.
|
|
26
|
+
|
|
27
|
+
Elements that roll beyond the last position are re-introduced at
|
|
28
|
+
the first.
|
|
29
|
+
|
|
30
|
+
Parameters
|
|
31
|
+
----------
|
|
32
|
+
a : array_like
|
|
33
|
+
Input tensor.
|
|
34
|
+
shift : int or tuple of ints
|
|
35
|
+
The number of places by which elements are shifted. If a tuple,
|
|
36
|
+
then `axis` must be a tuple of the same size, and each of the
|
|
37
|
+
given axes is shifted by the corresponding number. If an int
|
|
38
|
+
while `axis` is a tuple of ints, then the same value is used for
|
|
39
|
+
all given axes.
|
|
40
|
+
axis : int or tuple of ints, optional
|
|
41
|
+
Axis or axes along which elements are shifted. By default, the
|
|
42
|
+
tensor is flattened before shifting, after which the original
|
|
43
|
+
shape is restored.
|
|
44
|
+
|
|
45
|
+
Returns
|
|
46
|
+
-------
|
|
47
|
+
res : Tensor
|
|
48
|
+
Output tensor, with the same shape as `a`.
|
|
49
|
+
|
|
50
|
+
See Also
|
|
51
|
+
--------
|
|
52
|
+
rollaxis : Roll the specified axis backwards, until it lies in a
|
|
53
|
+
given position.
|
|
54
|
+
|
|
55
|
+
Notes
|
|
56
|
+
-----
|
|
57
|
+
|
|
58
|
+
Supports rolling over multiple dimensions simultaneously.
|
|
59
|
+
|
|
60
|
+
Examples
|
|
61
|
+
--------
|
|
62
|
+
>>> import maxframe.tensor as mt
|
|
63
|
+
|
|
64
|
+
>>> x = mt.arange(10)
|
|
65
|
+
>>> mt.roll(x, 2).execute()
|
|
66
|
+
array([8, 9, 0, 1, 2, 3, 4, 5, 6, 7])
|
|
67
|
+
|
|
68
|
+
>>> x2 = mt.reshape(x, (2,5))
|
|
69
|
+
>>> x2.execute()
|
|
70
|
+
array([[0, 1, 2, 3, 4],
|
|
71
|
+
[5, 6, 7, 8, 9]])
|
|
72
|
+
>>> mt.roll(x2, 1).execute()
|
|
73
|
+
array([[9, 0, 1, 2, 3],
|
|
74
|
+
[4, 5, 6, 7, 8]])
|
|
75
|
+
>>> mt.roll(x2, 1, axis=0).execute()
|
|
76
|
+
array([[5, 6, 7, 8, 9],
|
|
77
|
+
[0, 1, 2, 3, 4]])
|
|
78
|
+
>>> mt.roll(x2, 1, axis=1).execute()
|
|
79
|
+
array([[4, 0, 1, 2, 3],
|
|
80
|
+
[9, 5, 6, 7, 8]])
|
|
81
|
+
|
|
82
|
+
"""
|
|
83
|
+
from ..datasource import tensor as astensor
|
|
84
|
+
from ..merge import concatenate
|
|
85
|
+
|
|
86
|
+
a = astensor(a)
|
|
87
|
+
raw = a
|
|
88
|
+
|
|
89
|
+
if axis is None:
|
|
90
|
+
a = ravel(a)
|
|
91
|
+
axis = 0
|
|
92
|
+
|
|
93
|
+
if not isinstance(shift, Iterable):
|
|
94
|
+
shift = (shift,)
|
|
95
|
+
else:
|
|
96
|
+
shift = tuple(shift)
|
|
97
|
+
if not isinstance(axis, Iterable):
|
|
98
|
+
axis = (axis,)
|
|
99
|
+
else:
|
|
100
|
+
axis = tuple(axis)
|
|
101
|
+
|
|
102
|
+
for ax in axis:
|
|
103
|
+
validate_axis(a.ndim, ax)
|
|
104
|
+
broadcasted = np.broadcast(shift, axis)
|
|
105
|
+
if broadcasted.ndim > 1:
|
|
106
|
+
raise ValueError("'shift' and 'axis' should be scalars or 1D sequences")
|
|
107
|
+
|
|
108
|
+
shifts = {ax: 0 for ax in range(a.ndim)}
|
|
109
|
+
for s, ax in broadcasted:
|
|
110
|
+
shifts[ax] += s
|
|
111
|
+
|
|
112
|
+
for ax, s in shifts.items():
|
|
113
|
+
if s == 0:
|
|
114
|
+
continue
|
|
115
|
+
|
|
116
|
+
s = -s
|
|
117
|
+
s %= a.shape[ax]
|
|
118
|
+
|
|
119
|
+
slc1 = (slice(None),) * ax + (slice(s, None),)
|
|
120
|
+
slc2 = (slice(None),) * ax + (slice(s),)
|
|
121
|
+
|
|
122
|
+
a = concatenate([a[slc1], a[slc2]], axis=ax)
|
|
123
|
+
|
|
124
|
+
return a.reshape(raw.shape)
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
import numpy as np
|
|
16
|
+
|
|
17
|
+
from ..utils import validate_axis
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def rollaxis(tensor, axis, start=0):
|
|
21
|
+
"""
|
|
22
|
+
Roll the specified axis backwards, until it lies in a given position.
|
|
23
|
+
|
|
24
|
+
This function continues to be supported for backward compatibility, but you
|
|
25
|
+
should prefer `moveaxis`.
|
|
26
|
+
|
|
27
|
+
Parameters
|
|
28
|
+
----------
|
|
29
|
+
a : Tensor
|
|
30
|
+
Input tensor.
|
|
31
|
+
axis : int
|
|
32
|
+
The axis to roll backwards. The positions of the other axes do not
|
|
33
|
+
change relative to one another.
|
|
34
|
+
start : int, optional
|
|
35
|
+
The axis is rolled until it lies before this position. The default,
|
|
36
|
+
0, results in a "complete" roll.
|
|
37
|
+
|
|
38
|
+
Returns
|
|
39
|
+
-------
|
|
40
|
+
res : Tensor
|
|
41
|
+
a view of `a` is always returned.
|
|
42
|
+
|
|
43
|
+
See Also
|
|
44
|
+
--------
|
|
45
|
+
moveaxis : Move array axes to new positions.
|
|
46
|
+
roll : Roll the elements of an array by a number of positions along a
|
|
47
|
+
given axis.
|
|
48
|
+
|
|
49
|
+
Examples
|
|
50
|
+
--------
|
|
51
|
+
>>> import maxframe.tensor as mt
|
|
52
|
+
|
|
53
|
+
>>> a = mt.ones((3,4,5,6))
|
|
54
|
+
>>> mt.rollaxis(a, 3, 1).shape
|
|
55
|
+
(3, 6, 4, 5)
|
|
56
|
+
>>> mt.rollaxis(a, 2).shape
|
|
57
|
+
(5, 3, 4, 6)
|
|
58
|
+
>>> mt.rollaxis(a, 1, 4).shape
|
|
59
|
+
(3, 5, 6, 4)
|
|
60
|
+
|
|
61
|
+
"""
|
|
62
|
+
n = tensor.ndim
|
|
63
|
+
axis = validate_axis(n, axis)
|
|
64
|
+
if start < 0:
|
|
65
|
+
start += n
|
|
66
|
+
msg = "'%s' arg requires %d <= %s < %d, but %d was passed in"
|
|
67
|
+
if not (0 <= start < n + 1):
|
|
68
|
+
raise np.AxisError(msg % ("start", -n, "start", n + 1, start))
|
|
69
|
+
if axis < start:
|
|
70
|
+
# it's been removed
|
|
71
|
+
start -= 1
|
|
72
|
+
if axis == start:
|
|
73
|
+
return tensor
|
|
74
|
+
axes = list(range(0, n))
|
|
75
|
+
axes.remove(axis)
|
|
76
|
+
axes.insert(start, axis)
|
|
77
|
+
return tensor.transpose(axes)
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
import numpy as np
|
|
16
|
+
|
|
17
|
+
from ... import opcodes
|
|
18
|
+
from ...core import ExecutableTuple
|
|
19
|
+
from ...serialization.serializables import Int32Field
|
|
20
|
+
from ..core import TensorOrder
|
|
21
|
+
from ..datasource import tensor as astensor
|
|
22
|
+
from ..operators import TensorOperator, TensorOperatorMixin
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class TensorGetShape(TensorOperator, TensorOperatorMixin):
|
|
26
|
+
_op_type_ = opcodes.GET_SHAPE
|
|
27
|
+
|
|
28
|
+
ndim = Int32Field("ndim")
|
|
29
|
+
|
|
30
|
+
def __init__(self, pure_depends=None, **kw):
|
|
31
|
+
super().__init__(_pure_depends=pure_depends, **kw)
|
|
32
|
+
|
|
33
|
+
@property
|
|
34
|
+
def output_limit(self):
|
|
35
|
+
return self.ndim
|
|
36
|
+
|
|
37
|
+
def __call__(self, a):
|
|
38
|
+
if not np.isnan(a.size):
|
|
39
|
+
return ExecutableTuple([astensor(s) for s in a.shape])
|
|
40
|
+
|
|
41
|
+
kws = []
|
|
42
|
+
for i in range(self.output_limit):
|
|
43
|
+
kws.append(
|
|
44
|
+
{
|
|
45
|
+
"shape": (),
|
|
46
|
+
"dtype": np.dtype(np.intc),
|
|
47
|
+
"order": TensorOrder.C_ORDER,
|
|
48
|
+
"i": i,
|
|
49
|
+
}
|
|
50
|
+
)
|
|
51
|
+
return ExecutableTuple(self.new_tensors([a], kws=kws))
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def shape(a):
|
|
55
|
+
"""
|
|
56
|
+
Return the shape of a tensor.
|
|
57
|
+
|
|
58
|
+
Parameters
|
|
59
|
+
----------
|
|
60
|
+
a : array_like
|
|
61
|
+
Input tensor.
|
|
62
|
+
|
|
63
|
+
Returns
|
|
64
|
+
-------
|
|
65
|
+
shape : ExecutableTuple of tensors
|
|
66
|
+
The elements of the shape tuple give the lengths of the
|
|
67
|
+
corresponding array dimensions.
|
|
68
|
+
|
|
69
|
+
Examples
|
|
70
|
+
--------
|
|
71
|
+
>>> import maxframe.tensor as mt
|
|
72
|
+
|
|
73
|
+
>>> mt.shape(mt.eye(3)).execute()
|
|
74
|
+
(3, 3)
|
|
75
|
+
>>> mt.shape([[1, 2]]).execute()
|
|
76
|
+
(1, 2)
|
|
77
|
+
>>> mt.shape([0]).execute()
|
|
78
|
+
(1,)
|
|
79
|
+
>>> mt.shape(0).execute()
|
|
80
|
+
()
|
|
81
|
+
|
|
82
|
+
>>> a = mt.array([(1, 2), (3, 4)], dtype=[('x', 'i4'), ('y', 'i4')])
|
|
83
|
+
>>> mt.shape(a).execute()
|
|
84
|
+
(2,)
|
|
85
|
+
|
|
86
|
+
"""
|
|
87
|
+
a = astensor(a)
|
|
88
|
+
op = TensorGetShape(ndim=a.ndim)
|
|
89
|
+
return op(a)
|