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,249 @@
|
|
|
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 ... import opcodes
|
|
20
|
+
from ...serialization.serializables import AnyField, BoolField, FieldTypes, TupleField
|
|
21
|
+
from ..arithmetic import sqrt
|
|
22
|
+
from ..datasource import tensor as astensor
|
|
23
|
+
from ..operators import TensorHasInput, TensorOperatorMixin
|
|
24
|
+
from ..utils import validate_axis
|
|
25
|
+
from .svd import svd
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class TensorNorm(TensorHasInput, TensorOperatorMixin):
|
|
29
|
+
_op_type_ = opcodes.NORM
|
|
30
|
+
|
|
31
|
+
ord = AnyField("ord", default=None)
|
|
32
|
+
axis = TupleField("axis", FieldTypes.int32, default=0)
|
|
33
|
+
keepdims = BoolField("keepdims", default=None)
|
|
34
|
+
|
|
35
|
+
def __call__(self, x):
|
|
36
|
+
r = x.astype(self.dtype)
|
|
37
|
+
shape = self._norm(r, self.ord, self.axis, self.keepdims).shape
|
|
38
|
+
return self.new_tensor([x], shape)
|
|
39
|
+
|
|
40
|
+
@staticmethod
|
|
41
|
+
def _norm(r, ord, axis, keepdims):
|
|
42
|
+
if ord is None:
|
|
43
|
+
return sqrt((abs(r) ** 2).sum(axis=axis, keepdims=keepdims))
|
|
44
|
+
elif ord == "nuc":
|
|
45
|
+
if len(axis) == 1:
|
|
46
|
+
raise ValueError("Invalid norm order for vectors.")
|
|
47
|
+
return svd(r)[1][np.newaxis].sum(keepdims=keepdims)
|
|
48
|
+
elif ord == np.inf:
|
|
49
|
+
if r.ndim > 2:
|
|
50
|
+
raise ValueError("Improper number of dimensions to norm.")
|
|
51
|
+
r = abs(r)
|
|
52
|
+
if len(axis) == 1:
|
|
53
|
+
return r.max(axis=axis, keepdims=keepdims)
|
|
54
|
+
else:
|
|
55
|
+
return r.sum(axis=axis[1], keepdims=keepdims).max(keepdims=keepdims)
|
|
56
|
+
elif ord == -np.inf:
|
|
57
|
+
if r.ndim > 2:
|
|
58
|
+
raise ValueError("Improper number of dimensions to norm.")
|
|
59
|
+
r = abs(r)
|
|
60
|
+
if len(axis) == 1:
|
|
61
|
+
return r.min(axis=axis, keepdims=keepdims)
|
|
62
|
+
else:
|
|
63
|
+
return r.sum(axis=axis[1], keepdims=keepdims).min(keepdims=keepdims)
|
|
64
|
+
elif ord == 0:
|
|
65
|
+
if r.ndim > 2:
|
|
66
|
+
raise ValueError("Improper number of dimensions to norm.")
|
|
67
|
+
if len(axis) == 2:
|
|
68
|
+
raise ValueError("Invalid norm order for matrices.")
|
|
69
|
+
return (r != 0).astype(r.dtype).sum(axis=axis, keepdims=keepdims)
|
|
70
|
+
elif ord == 1:
|
|
71
|
+
if r.ndim > 2:
|
|
72
|
+
raise ValueError("Improper number of dimensions to norm.")
|
|
73
|
+
r = abs(r)
|
|
74
|
+
if len(axis) == 1:
|
|
75
|
+
return r.sum(axis=axis, keepdims=keepdims)
|
|
76
|
+
else:
|
|
77
|
+
return r.sum(axis=axis[0], keepdims=keepdims).max(keepdims=keepdims)
|
|
78
|
+
elif ord == -1 and len(axis) == 2:
|
|
79
|
+
if r.ndim > 2:
|
|
80
|
+
raise ValueError("Improper number of dimensions to norm.")
|
|
81
|
+
return abs(r).sum(axis=axis[0], keepdims=keepdims).min(keepdims=keepdims)
|
|
82
|
+
elif ord == 2 and len(axis) == 2:
|
|
83
|
+
return svd(r)[1][np.newaxis].max(keepdims=keepdims)
|
|
84
|
+
elif ord == -2 and len(axis) == 2:
|
|
85
|
+
return svd(r)[1][np.newaxis].min(keepdims=keepdims)
|
|
86
|
+
else:
|
|
87
|
+
if len(axis) == 2:
|
|
88
|
+
raise ValueError("Invalid norm order for matrices.")
|
|
89
|
+
|
|
90
|
+
return (abs(r) ** ord).sum(axis=axis, keepdims=keepdims) ** (1.0 / ord)
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def norm(x, ord=None, axis=None, keepdims=False):
|
|
94
|
+
r"""
|
|
95
|
+
Matrix or vector norm.
|
|
96
|
+
|
|
97
|
+
This function is able to return one of eight different matrix norms,
|
|
98
|
+
or one of an infinite number of vector norms (described below), depending
|
|
99
|
+
on the value of the ``ord`` parameter.
|
|
100
|
+
|
|
101
|
+
Parameters
|
|
102
|
+
----------
|
|
103
|
+
x : array_like
|
|
104
|
+
Input tensor. If `axis` is None, `x` must be 1-D or 2-D.
|
|
105
|
+
ord : {non-zero int, inf, -inf, 'fro', 'nuc'}, optional
|
|
106
|
+
Order of the norm (see table under ``Notes``). inf means maxframe tensor's
|
|
107
|
+
`inf` object.
|
|
108
|
+
axis : {int, 2-tuple of ints, None}, optional
|
|
109
|
+
If `axis` is an integer, it specifies the axis of `x` along which to
|
|
110
|
+
compute the vector norms. If `axis` is a 2-tuple, it specifies the
|
|
111
|
+
axes that hold 2-D matrices, and the matrix norms of these matrices
|
|
112
|
+
are computed. If `axis` is None then either a vector norm (when `x`
|
|
113
|
+
is 1-D) or a matrix norm (when `x` is 2-D) is returned.
|
|
114
|
+
keepdims : bool, optional
|
|
115
|
+
If this is set to True, the axes which are normed over are left in the
|
|
116
|
+
result as dimensions with size one. With this option the result will
|
|
117
|
+
broadcast correctly against the original `x`.
|
|
118
|
+
|
|
119
|
+
Returns
|
|
120
|
+
-------
|
|
121
|
+
n : float or Tensor
|
|
122
|
+
Norm of the matrix or vector(s).
|
|
123
|
+
|
|
124
|
+
Notes
|
|
125
|
+
-----
|
|
126
|
+
For values of ``ord <= 0``, the result is, strictly speaking, not a
|
|
127
|
+
mathematical 'norm', but it may still be useful for various numerical
|
|
128
|
+
purposes.
|
|
129
|
+
|
|
130
|
+
The following norms can be calculated:
|
|
131
|
+
|
|
132
|
+
===== ============================ ==========================
|
|
133
|
+
ord norm for matrices norm for vectors
|
|
134
|
+
===== ============================ ==========================
|
|
135
|
+
None Frobenius norm 2-norm
|
|
136
|
+
'fro' Frobenius norm --
|
|
137
|
+
'nuc' nuclear norm --
|
|
138
|
+
inf max(sum(abs(x), axis=1)) max(abs(x))
|
|
139
|
+
-inf min(sum(abs(x), axis=1)) min(abs(x))
|
|
140
|
+
0 -- sum(x != 0)
|
|
141
|
+
1 max(sum(abs(x), axis=0)) as below
|
|
142
|
+
-1 min(sum(abs(x), axis=0)) as below
|
|
143
|
+
2 2-norm (largest sing. value) as below
|
|
144
|
+
-2 smallest singular value as below
|
|
145
|
+
other -- sum(abs(x)**ord)**(1./ord)
|
|
146
|
+
===== ============================ ==========================
|
|
147
|
+
|
|
148
|
+
The Frobenius norm is given by [1]_:
|
|
149
|
+
|
|
150
|
+
:math:`||A||_F = [\\sum_{i,j} abs(a_{i,j})^2]^{1/2}`
|
|
151
|
+
|
|
152
|
+
The nuclear norm is the sum of the singular values.
|
|
153
|
+
|
|
154
|
+
References
|
|
155
|
+
----------
|
|
156
|
+
.. [1] G. H. Golub and C. F. Van Loan, *Matrix Computations*,
|
|
157
|
+
Baltimore, MD, Johns Hopkins University Press, 1985, pg. 15
|
|
158
|
+
|
|
159
|
+
Examples
|
|
160
|
+
--------
|
|
161
|
+
>>> from maxframe.tensor import linalg as LA
|
|
162
|
+
>>> import maxframe.tensor as mt
|
|
163
|
+
>>> a = mt.arange(9) - 4
|
|
164
|
+
>>> a.execute()
|
|
165
|
+
array([-4, -3, -2, -1, 0, 1, 2, 3, 4])
|
|
166
|
+
>>> b = a.reshape((3, 3))
|
|
167
|
+
>>> b.execute()
|
|
168
|
+
array([[-4, -3, -2],
|
|
169
|
+
[-1, 0, 1],
|
|
170
|
+
[ 2, 3, 4]])
|
|
171
|
+
|
|
172
|
+
>>> LA.norm(a).execute()
|
|
173
|
+
7.745966692414834
|
|
174
|
+
>>> LA.norm(b).execute()
|
|
175
|
+
7.745966692414834
|
|
176
|
+
>>> LA.norm(b, 'fro').execute()
|
|
177
|
+
7.745966692414834
|
|
178
|
+
>>> LA.norm(a, mt.inf).execute()
|
|
179
|
+
4.0
|
|
180
|
+
>>> LA.norm(b, mt.inf).execute()
|
|
181
|
+
9.0
|
|
182
|
+
>>> LA.norm(a, -mt.inf).execute()
|
|
183
|
+
0.0
|
|
184
|
+
>>> LA.norm(b, -mt.inf).execute()
|
|
185
|
+
2.0
|
|
186
|
+
|
|
187
|
+
>>> LA.norm(a, 1).execute()
|
|
188
|
+
20.0
|
|
189
|
+
>>> LA.norm(b, 1).execute()
|
|
190
|
+
7.0
|
|
191
|
+
>>> LA.norm(a, -1).execute()
|
|
192
|
+
0.0
|
|
193
|
+
>>> LA.norm(b, -1).execute()
|
|
194
|
+
6.0
|
|
195
|
+
>>> LA.norm(a, 2).execute()
|
|
196
|
+
7.745966692414834
|
|
197
|
+
>>> LA.norm(b, 2).execute()
|
|
198
|
+
7.3484692283495345
|
|
199
|
+
|
|
200
|
+
>>> LA.norm(a, -2).execute()
|
|
201
|
+
0.0
|
|
202
|
+
>>> LA.norm(b, -2).execute()
|
|
203
|
+
4.351066026358965e-18
|
|
204
|
+
>>> LA.norm(a, 3).execute()
|
|
205
|
+
5.8480354764257312
|
|
206
|
+
>>> LA.norm(a, -3).execute()
|
|
207
|
+
0.0
|
|
208
|
+
|
|
209
|
+
Using the `axis` argument to compute vector norms:
|
|
210
|
+
|
|
211
|
+
>>> c = mt.array([[ 1, 2, 3],
|
|
212
|
+
... [-1, 1, 4]])
|
|
213
|
+
>>> LA.norm(c, axis=0).execute()
|
|
214
|
+
array([ 1.41421356, 2.23606798, 5. ])
|
|
215
|
+
>>> LA.norm(c, axis=1).execute()
|
|
216
|
+
array([ 3.74165739, 4.24264069])
|
|
217
|
+
>>> LA.norm(c, ord=1, axis=1).execute()
|
|
218
|
+
array([ 6., 6.])
|
|
219
|
+
|
|
220
|
+
Using the `axis` argument to compute matrix norms:
|
|
221
|
+
|
|
222
|
+
>>> m = mt.arange(8).reshape(2,2,2)
|
|
223
|
+
>>> LA.norm(m, axis=(1,2)).execute()
|
|
224
|
+
array([ 3.74165739, 11.22497216])
|
|
225
|
+
>>> LA.norm(m[0, :, :]).execute(), LA.norm(m[1, :, :]).execute()
|
|
226
|
+
(3.7416573867739413, 11.224972160321824)
|
|
227
|
+
|
|
228
|
+
"""
|
|
229
|
+
x = astensor(x)
|
|
230
|
+
ndim = x.ndim
|
|
231
|
+
|
|
232
|
+
if ord == "fro":
|
|
233
|
+
ord = None
|
|
234
|
+
if axis is not None:
|
|
235
|
+
if isinstance(axis, Iterable):
|
|
236
|
+
axis = tuple(validate_axis(ndim, a) for a in axis)
|
|
237
|
+
else:
|
|
238
|
+
axis = (validate_axis(ndim, axis),)
|
|
239
|
+
else:
|
|
240
|
+
axis = tuple(range(x.ndim))
|
|
241
|
+
|
|
242
|
+
op = TensorNorm(
|
|
243
|
+
ord=ord,
|
|
244
|
+
axis=axis,
|
|
245
|
+
keepdims=keepdims,
|
|
246
|
+
dtype=np.result_type(x.dtype, np.float_),
|
|
247
|
+
sparse=x.issparse(),
|
|
248
|
+
)
|
|
249
|
+
return op(x)
|
|
@@ -0,0 +1,72 @@
|
|
|
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 .cholesky import cholesky
|
|
17
|
+
from .lu import lu
|
|
18
|
+
from .solve_triangular import solve_triangular
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def solve(a, b, sym_pos=False, sparse=None):
|
|
22
|
+
"""
|
|
23
|
+
Solve the equation ``a x = b`` for ``x``.
|
|
24
|
+
|
|
25
|
+
Parameters
|
|
26
|
+
----------
|
|
27
|
+
a : (M, M) array_like
|
|
28
|
+
A square matrix.
|
|
29
|
+
b : (M,) or (M, N) array_like
|
|
30
|
+
Right-hand side matrix in ``a x = b``.
|
|
31
|
+
sym_pos : bool
|
|
32
|
+
Assume `a` is symmetric and positive definite. If ``True``, use Cholesky
|
|
33
|
+
decomposition.
|
|
34
|
+
sparse: bool, optional
|
|
35
|
+
Return sparse value or not.
|
|
36
|
+
|
|
37
|
+
Returns
|
|
38
|
+
-------
|
|
39
|
+
x : (M,) or (M, N) ndarray
|
|
40
|
+
Solution to the system ``a x = b``. Shape of the return matches the
|
|
41
|
+
shape of `b`.
|
|
42
|
+
|
|
43
|
+
Raises
|
|
44
|
+
------
|
|
45
|
+
LinAlgError
|
|
46
|
+
If `a` is singular.
|
|
47
|
+
|
|
48
|
+
Examples
|
|
49
|
+
--------
|
|
50
|
+
Given `a` and `b`, solve for `x`:
|
|
51
|
+
|
|
52
|
+
>>> import maxframe.tensor as mt
|
|
53
|
+
>>> a = mt.array([[3, 2, 0], [1, -1, 0], [0, 5, 1]])
|
|
54
|
+
>>> b = mt.array([2, 4, -1])
|
|
55
|
+
>>> x = mt.linalg.solve(a, b)
|
|
56
|
+
>>> x.execute()
|
|
57
|
+
array([ 2., -2., 9.])
|
|
58
|
+
|
|
59
|
+
>>> mt.dot(a, x).execute() # Check the result
|
|
60
|
+
array([ 2., 4., -1.])
|
|
61
|
+
"""
|
|
62
|
+
a = astensor(a)
|
|
63
|
+
b = astensor(b)
|
|
64
|
+
if sym_pos:
|
|
65
|
+
l_ = cholesky(a, lower=True)
|
|
66
|
+
u = l_.T
|
|
67
|
+
else:
|
|
68
|
+
p, l_, u = lu(a)
|
|
69
|
+
b = p.T.dot(b)
|
|
70
|
+
sparse = sparse if sparse is not None else a.issparse()
|
|
71
|
+
uy = solve_triangular(l_, b, lower=True, sparse=sparse)
|
|
72
|
+
return solve_triangular(u, uy, sparse=sparse)
|
|
@@ -30,8 +30,8 @@ class TensorSolveTriangular(TensorOperator, TensorOperatorMixin):
|
|
|
30
30
|
|
|
31
31
|
a = KeyField("a")
|
|
32
32
|
b = KeyField("b")
|
|
33
|
-
lower = BoolField("lower")
|
|
34
|
-
strict = BoolField("strict")
|
|
33
|
+
lower = BoolField("lower", default=None)
|
|
34
|
+
strict = BoolField("strict", default=None)
|
|
35
35
|
|
|
36
36
|
@classmethod
|
|
37
37
|
def _set_inputs(cls, op: "TensorSolveTriangular", inputs: List[EntityData]):
|
|
@@ -0,0 +1,113 @@
|
|
|
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 ..utils import normalize_axis_tuple
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def vector_norm(x, *, axis=None, keepdims=False, ord=2):
|
|
19
|
+
"""
|
|
20
|
+
Computes the vector norm of a vector (or batch of vectors) ``x``.
|
|
21
|
+
|
|
22
|
+
This function is Array API compatible.
|
|
23
|
+
|
|
24
|
+
Parameters
|
|
25
|
+
----------
|
|
26
|
+
x : array_like
|
|
27
|
+
Input array.
|
|
28
|
+
axis : {None, int, 2-tuple of ints}, optional
|
|
29
|
+
If an integer, ``axis`` specifies the axis (dimension) along which
|
|
30
|
+
to compute vector norms. If an n-tuple, ``axis`` specifies the axes
|
|
31
|
+
(dimensions) along which to compute batched vector norms. If ``None``,
|
|
32
|
+
the vector norm must be computed over all array values (i.e.,
|
|
33
|
+
equivalent to computing the vector norm of a flattened array).
|
|
34
|
+
Default: ``None``.
|
|
35
|
+
keepdims : bool, optional
|
|
36
|
+
If this is set to True, the axes which are normed over are left in
|
|
37
|
+
the result as dimensions with size one. Default: False.
|
|
38
|
+
ord : {int, float, inf, -inf}, optional
|
|
39
|
+
The order of the norm. For details see the table under ``Notes``
|
|
40
|
+
in `numpy.linalg.norm`.
|
|
41
|
+
|
|
42
|
+
See Also
|
|
43
|
+
--------
|
|
44
|
+
numpy.linalg.norm : Generic norm function
|
|
45
|
+
|
|
46
|
+
Examples
|
|
47
|
+
--------
|
|
48
|
+
>>> from numpy import linalg as LA
|
|
49
|
+
>>> a = np.arange(9) + 1
|
|
50
|
+
>>> a
|
|
51
|
+
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
|
|
52
|
+
>>> b = a.reshape((3, 3))
|
|
53
|
+
>>> b
|
|
54
|
+
array([[1, 2, 3],
|
|
55
|
+
[4, 5, 6],
|
|
56
|
+
[7, 8, 9]])
|
|
57
|
+
|
|
58
|
+
>>> LA.vector_norm(b)
|
|
59
|
+
16.881943016134134
|
|
60
|
+
>>> LA.vector_norm(b, ord=np.inf)
|
|
61
|
+
9.0
|
|
62
|
+
>>> LA.vector_norm(b, ord=-np.inf)
|
|
63
|
+
1.0
|
|
64
|
+
|
|
65
|
+
>>> LA.vector_norm(b, ord=0)
|
|
66
|
+
9.0
|
|
67
|
+
>>> LA.vector_norm(b, ord=1)
|
|
68
|
+
45.0
|
|
69
|
+
>>> LA.vector_norm(b, ord=-1)
|
|
70
|
+
0.3534857623790153
|
|
71
|
+
>>> LA.vector_norm(b, ord=2)
|
|
72
|
+
16.881943016134134
|
|
73
|
+
>>> LA.vector_norm(b, ord=-2)
|
|
74
|
+
0.8058837395885292
|
|
75
|
+
|
|
76
|
+
"""
|
|
77
|
+
from ..datasource.array import asarray
|
|
78
|
+
from ..misc import transpose
|
|
79
|
+
from ..reduction import prod
|
|
80
|
+
from .norm import norm
|
|
81
|
+
|
|
82
|
+
x = asarray(x)
|
|
83
|
+
shape = list(x.shape)
|
|
84
|
+
if axis is None:
|
|
85
|
+
# Note: np.linalg.norm() doesn't handle 0-D arrays
|
|
86
|
+
x = x.ravel()
|
|
87
|
+
_axis = 0
|
|
88
|
+
elif isinstance(axis, tuple):
|
|
89
|
+
# Note: The axis argument supports any number of axes, whereas
|
|
90
|
+
# np.linalg.norm() only supports a single axis for vector norm.
|
|
91
|
+
normalized_axis = normalize_axis_tuple(axis, x.ndim)
|
|
92
|
+
rest = tuple(i for i in range(x.ndim) if i not in normalized_axis)
|
|
93
|
+
newshape = axis + rest
|
|
94
|
+
x = transpose(x, newshape).reshape(
|
|
95
|
+
(prod([x.shape[i] for i in axis], dtype=int), *[x.shape[i] for i in rest])
|
|
96
|
+
)
|
|
97
|
+
_axis = 0
|
|
98
|
+
else:
|
|
99
|
+
_axis = axis
|
|
100
|
+
|
|
101
|
+
res = norm(x, axis=_axis, ord=ord)
|
|
102
|
+
|
|
103
|
+
if keepdims:
|
|
104
|
+
# We can't reuse np.linalg.norm(keepdims) because of the reshape hacks
|
|
105
|
+
# above to avoid matrix norm logic.
|
|
106
|
+
_axis = normalize_axis_tuple(
|
|
107
|
+
range(len(shape)) if axis is None else axis, len(shape)
|
|
108
|
+
)
|
|
109
|
+
for i in _axis:
|
|
110
|
+
shape[i] = 1
|
|
111
|
+
res = res.reshape(tuple(shape))
|
|
112
|
+
|
|
113
|
+
return res
|
maxframe/tensor/misc/__init__.py
CHANGED
|
@@ -12,26 +12,47 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from .argwhere import TensorArgwhere, argwhere
|
|
16
|
+
from .array_split import array_split
|
|
15
17
|
from .astype import TensorAstype, astype
|
|
16
18
|
from .atleast_1d import atleast_1d
|
|
17
19
|
from .atleast_2d import atleast_2d
|
|
18
20
|
from .atleast_3d import atleast_3d
|
|
21
|
+
from .broadcast_arrays import broadcast_arrays
|
|
19
22
|
from .broadcast_to import TensorBroadcastTo, broadcast_to
|
|
20
23
|
from .copy import copy
|
|
24
|
+
from .copyto import TensorCopyTo, copyto
|
|
25
|
+
from .delete import TensorDelete, delete
|
|
21
26
|
from .diff import TensorDiff, diff
|
|
27
|
+
from .dsplit import dsplit
|
|
28
|
+
from .ediff1d import ediff1d
|
|
29
|
+
from .expand_dims import expand_dims
|
|
22
30
|
from .flatten import flatten
|
|
31
|
+
from .flip import flip
|
|
32
|
+
from .fliplr import fliplr
|
|
33
|
+
from .flipud import flipud
|
|
34
|
+
from .hsplit import hsplit
|
|
23
35
|
from .in1d import in1d
|
|
36
|
+
from .insert import insert
|
|
24
37
|
from .isin import TensorIsIn, isin
|
|
38
|
+
from .moveaxis import moveaxis
|
|
25
39
|
from .ndim import ndim
|
|
26
40
|
from .ravel import ravel
|
|
27
41
|
from .repeat import TensorRepeat, repeat
|
|
42
|
+
from .result_type import result_type
|
|
43
|
+
from .roll import roll
|
|
44
|
+
from .rollaxis import rollaxis
|
|
28
45
|
from .searchsorted import TensorSearchsorted, searchsorted
|
|
29
46
|
from .setdiff1d import setdiff1d
|
|
47
|
+
from .shape import TensorGetShape, shape
|
|
48
|
+
from .split import TensorSplit, split
|
|
30
49
|
from .squeeze import TensorSqueeze, squeeze
|
|
31
50
|
from .swapaxes import TensorSwapAxes, swapaxes
|
|
51
|
+
from .tile import tile
|
|
32
52
|
from .transpose import TensorTranspose, transpose
|
|
33
53
|
from .trapezoid import TensorTrapezoid, trapezoid
|
|
34
54
|
from .unique import TensorUnique, unique
|
|
55
|
+
from .vsplit import vsplit
|
|
35
56
|
from .where import TensorWhere, where
|
|
36
57
|
|
|
37
58
|
|
|
@@ -41,8 +62,10 @@ def _install():
|
|
|
41
62
|
for cls in (Tensor, TensorData):
|
|
42
63
|
setattr(cls, "astype", astype)
|
|
43
64
|
setattr(cls, "flatten", flatten)
|
|
44
|
-
setattr(cls, "swapaxes", swapaxes)
|
|
45
65
|
setattr(cls, "ravel", ravel)
|
|
66
|
+
setattr(cls, "repeat", repeat)
|
|
67
|
+
setattr(cls, "squeeze", squeeze)
|
|
68
|
+
setattr(cls, "swapaxes", swapaxes)
|
|
46
69
|
|
|
47
70
|
|
|
48
71
|
_install()
|
|
@@ -0,0 +1,72 @@
|
|
|
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 ..datasource import tensor as astensor
|
|
19
|
+
from ..operators import TensorHasInput, TensorOperatorMixin
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class TensorArgwhere(TensorHasInput, TensorOperatorMixin):
|
|
23
|
+
_op_type_ = opcodes.ARGWHERE
|
|
24
|
+
|
|
25
|
+
def __call__(self, a):
|
|
26
|
+
shape = (np.nan, a.ndim)
|
|
27
|
+
return self.new_tensor([a], shape)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def argwhere(a):
|
|
31
|
+
"""
|
|
32
|
+
Find the indices of tensor elements that are non-zero, grouped by element.
|
|
33
|
+
|
|
34
|
+
Parameters
|
|
35
|
+
----------
|
|
36
|
+
a : array_like
|
|
37
|
+
Input data.
|
|
38
|
+
|
|
39
|
+
Returns
|
|
40
|
+
-------
|
|
41
|
+
index_tensor : Tensor
|
|
42
|
+
Indices of elements that are non-zero. Indices are grouped by element.
|
|
43
|
+
|
|
44
|
+
See Also
|
|
45
|
+
--------
|
|
46
|
+
where, nonzero
|
|
47
|
+
|
|
48
|
+
Notes
|
|
49
|
+
-----
|
|
50
|
+
``mt.argwhere(a)`` is the same as ``mt.transpose(mt.nonzero(a))``.
|
|
51
|
+
|
|
52
|
+
The output of ``argwhere`` is not suitable for indexing tensors.
|
|
53
|
+
For this purpose use ``nonzero(a)`` instead.
|
|
54
|
+
|
|
55
|
+
Examples
|
|
56
|
+
--------
|
|
57
|
+
>>> import maxframe.tensor as mt
|
|
58
|
+
|
|
59
|
+
>>> x = mt.arange(6).reshape(2,3)
|
|
60
|
+
>>> x.execute()
|
|
61
|
+
array([[0, 1, 2],
|
|
62
|
+
[3, 4, 5]])
|
|
63
|
+
>>> mt.argwhere(x>1).execute()
|
|
64
|
+
array([[0, 2],
|
|
65
|
+
[1, 0],
|
|
66
|
+
[1, 1],
|
|
67
|
+
[1, 2]])
|
|
68
|
+
|
|
69
|
+
"""
|
|
70
|
+
a = astensor(a).astype(bool, order="A")
|
|
71
|
+
op = TensorArgwhere(dtype=np.dtype(np.intp))
|
|
72
|
+
return op(a)
|
|
@@ -0,0 +1,46 @@
|
|
|
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 array_split(a, indices_or_sections, axis=0):
|
|
19
|
+
"""
|
|
20
|
+
Split a tensor into multiple sub-tensors.
|
|
21
|
+
|
|
22
|
+
Please refer to the ``split`` documentation. The only difference
|
|
23
|
+
between these functions is that ``array_split`` allows
|
|
24
|
+
`indices_or_sections` to be an integer that does *not* equally
|
|
25
|
+
divide the axis. For a tensor of length l that should be split
|
|
26
|
+
into n sections, it returns l % n sub-arrays of size l//n + 1
|
|
27
|
+
and the rest of size l//n.
|
|
28
|
+
|
|
29
|
+
See Also
|
|
30
|
+
--------
|
|
31
|
+
split : Split tensor into multiple sub-tensors of equal size.
|
|
32
|
+
|
|
33
|
+
Examples
|
|
34
|
+
--------
|
|
35
|
+
>>> import maxframe.tensor as mt
|
|
36
|
+
|
|
37
|
+
>>> x = mt.arange(8.0)
|
|
38
|
+
>>> mt.array_split(x, 3).execute()
|
|
39
|
+
[array([ 0., 1., 2.]), array([ 3., 4., 5.]), array([ 6., 7.])]
|
|
40
|
+
|
|
41
|
+
>>> x = mt.arange(7.0)
|
|
42
|
+
>>> mt.array_split(x, 3).execute()
|
|
43
|
+
[array([ 0., 1., 2.]), array([ 3., 4.]), array([ 5., 6.])]
|
|
44
|
+
|
|
45
|
+
"""
|
|
46
|
+
return _split(a, indices_or_sections, axis=axis)
|
|
@@ -0,0 +1,57 @@
|
|
|
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 ...core import ExecutableTuple
|
|
16
|
+
from ..datasource import tensor as astensor
|
|
17
|
+
from ..utils import broadcast_shape
|
|
18
|
+
from .broadcast_to import broadcast_to
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def broadcast_arrays(*args, **kwargs):
|
|
22
|
+
"""
|
|
23
|
+
Broadcast any number of arrays against each other.
|
|
24
|
+
|
|
25
|
+
Parameters
|
|
26
|
+
----------
|
|
27
|
+
`*args` : array_likes
|
|
28
|
+
The tensors to broadcast.
|
|
29
|
+
|
|
30
|
+
Returns
|
|
31
|
+
-------
|
|
32
|
+
broadcasted : list of tensors
|
|
33
|
+
|
|
34
|
+
Examples
|
|
35
|
+
--------
|
|
36
|
+
>>> import maxframe.tensor as mt
|
|
37
|
+
|
|
38
|
+
>>> x = mt.array([[1,2,3]])
|
|
39
|
+
>>> y = mt.array([[1],[2],[3]])
|
|
40
|
+
>>> mt.broadcast_arrays(x, y).execute()
|
|
41
|
+
[array([[1, 2, 3],
|
|
42
|
+
[1, 2, 3],
|
|
43
|
+
[1, 2, 3]]), array([[1, 1, 1],
|
|
44
|
+
[2, 2, 2],
|
|
45
|
+
[3, 3, 3]])]
|
|
46
|
+
|
|
47
|
+
"""
|
|
48
|
+
if kwargs:
|
|
49
|
+
raise TypeError(
|
|
50
|
+
"broadcast_arrays() got an unexpected keyword "
|
|
51
|
+
f"argument {next(iter(kwargs.keys()))!r}"
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
args = [astensor(arg) for arg in args]
|
|
55
|
+
|
|
56
|
+
shape = broadcast_shape(*[arg.shape for arg in args])
|
|
57
|
+
return ExecutableTuple([broadcast_to(a, shape) for a in args])
|